% -*- coding: utf-8; time-stamp-format: "%02d-%02m-%:y at %02H:%02M:%02S %Z" -*- %<*none> \def\dtxtimestamp {Time-stamp: <23-01-2018 at 20:31:53 CET>} % %<*!readme> %% %% Package: footnotehyper %% Version: 1.1 (2018/01/23) %% License: LPPL 1.3c %% Copyright (C) 2016-2018 Jean-Francois Burnol . %% % %<*insfile|tex> \def\pkgname {footnotehyper} \def\pkgdate {2018/01/23} \def\docdate {2018/01/23} \def\pkgversion {v1.1} \def\pkgdescription {hyperref aware footnote.sty (JFB)} % %<*none> % Definition of \pkgLicense \begingroup% cette méthode ne marcherait pas avec caractères en dehors de 32-127 \long\def\firstofone #1{#1}\catcode1=14\catcode2=0 \catcode`\%=12\catcode`\_=12\endlinechar13\catcode13=13 ^^A \catcode32=13\catcode`\\=12^^Brelax^^A ^^Bfirstofone{^^Bendgroup^^Bdef^^BpkgLicense^^A {% Package: footnotehyper % Version: 1.1 (2018/01/23) % License: LPPL 1.3c % Copyright (C) 2016-2018 Jean-Francois Burnol . % % This Work may be distributed and/or modified under the conditions % of the LaTeX Project Public License, version 1.3c. This version of % this license is in: % % > % % and the latest version of this license is in: % % > % % Version 1.3 or later is part of all distributions of % LaTeX version 2005/12/01 or later. % % The Author of this Work is: Jean-Francois Burnol `` % % This Work consists of the main source file footnotehyper.dtx and the % derived files footnotehyper.sty, footnotehyper.ins, footnotehyper.tex, % footnotehyper.pdf, footnotehyper.dvi. }}% \begingroup\catcode1 0 \catcode`\\ 12 ^^Aiffalse % %<*readme> Source: footnotehyper.dtx (v1.1 2018/01/23) Author: Jean-Francois Burnol Info: hyperref aware footnote.sty License: LPPL 1.3c Copyright (C) 2016-2018 Jean-Francois Burnol . ABSTRACT ======== The `footnote` package by Mark Wooding (`1997/01/28` `1.13`) allows to gather footnotes (`\begin{savenotes}`) and later insert them (after `\end{savenotes}`) at the bottom of the page, even if the intervening material consists of tabulars, minipages or framed contents for example. One can also use the `\savenotes/\spewnotes` syntax. Also, `footnote.sty` provides a `footnote` environment which allows to insert verbatim material. Earlier releases of the present `footnotehyper` package added patches for `hyperref` compatibility and some bugfixes, addressing in particular the incompatibility with `color/xcolor`, and with `babel-frenchb`, and also fixing the `footnote` environment with optional argument `[NUM]`. Since `v0.99` all macros are defined internally and the `footnote` package is not loaded at all. The same user interface is kept. Since `v1.0` it is possible to use `footnotehyper` also in absence of `hyperref` or when the latter is loaded with its `hyperfootnotes=false` option. The order of loading of `footnotehyper` and `hyperref` is inconsequential. INSTALLATION ============ To extract the package (.sty) and driver (.tex) files from footnotehyper.dtx: - if footnotehyper.ins is present: etex footnotehyper.ins - without footnotehyper.ins: etex footnotehyper.dtx - or run latex or pdflatex directly on footnotehyper.dtx At least three ways to produce footnotehyper.pdf (method (1) is preferred): 1. latex footnotehyper.tex (twice), then dvipdfmx 2. pdflatex footnotehyper.dtx (twice) 3. latex footnotehyper.dtx (twice), then dvips, then ps2pdf Method (1) produces the smallest pdf files. Options can be set in footnotehyper.tex: - scrdoc class options (paper size, font size, ...) - with or without source code, - with dvipdfmx or with latex+dvips or pdflatex. Installation: footnotehyper.sty -> TDS:tex/latex/footnotehyper/footnotehyper.sty footnotehyper.dtx -> TDS:source/latex/footnotehyper/footnotehyper.dtx footnotehyper.pdf -> TDS:doc/latex/footnotehyper/footnotehyper.pdf README.md -> TDS:doc/latex/footnotehyper/README.md The other files may be discarded. LICENSE ======= This Work may be distributed and/or modified under the conditions of the LaTeX Project Public License, version 1.3c. This version of this license is in: > and the latest version of this license is in: > Version 1.3 or later is part of all distributions of LaTeX version 2005/12/01 or later. The Author of this Work is: - Jean-Francois Burnol `` This Work consists of the main source file footnotehyper.dtx and the derived files footnotehyper.sty, footnotehyper.ins, footnotehyper.tex, footnotehyper.pdf, footnotehyper.dvi. % %<*tex>------------------------------------------------------------------------- %% %% run latex twice on this file footnotehyper.tex then dvipdfmx on %% footnotehyper.dvi to produce the documentation footnotehyper.pdf, with %% source code included. %% \chardef\Withdvipdfmx 1 % replace 1 by 0 for using latex+dvips or pdflatex \chardef\NoSourceCode 0 % replace 0 by 1 for the doc *without* the source code \NeedsTeXFormat{LaTeX2e} \ProvidesFile {\pkgname.tex}[Driver for \pkgname\space documentation]% \PassOptionsToClass {a4paper,fontsize=11pt,oneside}{scrdoc} \PassOptionsToPackage {english}{babel} \input \pkgname.dtx %%% Local Variables: %%% mode: latex %%% End: %------------------------------------------------------------------------- %<*insfile>--------------------------------------------------------------------- %% %% Run tex on this file to extract from footnotehyper.dtx: %% footnotehyper.sty, footnotehyper.tex, and README.md %% %% Refer to README.md for installation instructions, if needed. %% \input docstrip.tex \askforoverwritefalse \def\pkgpreamble{\defaultpreamble^^J\MetaPrefix^^J% \string\NeedsTeXFormat{LaTeX2e}^^J% \string\ProvidesPackage{\pkgname}\perCent^^J% \space[\pkgdate\space\pkgversion\space\pkgdescription]}% \generate{\nopreamble\nopostamble \file{README.md}{\from{\pkgname.dtx}{readme}}% \usepostamble\defaultpostamble \file{\pkgname.tex}{\from{\pkgname.dtx}{tex}}% \usepreamble\pkgpreamble \file{\pkgname.sty}{\from{\pkgname.dtx}{package}}}% \catcode32=13\relax% active space \let =\space% \Msg{************************************************************************} \Msg{*} \Msg{* To finish the installation you have to move the following} \Msg{* file into a directory searched by TeX:} \Msg{*} \Msg{* \pkgname.sty} \Msg{*} \Msg{* To produce the documentation run latex twice on file \pkgname.tex} \Msg{* and then run dvipdfmx on file \pkgname.dvi.} \Msg{*} \Msg{* Happy TeXing!} \Msg{*} \Msg{************************************************************************} \endbatchfile %--------------------------------------------------------------------- %<*none>------------------------------------------------------------------------ ^^Afi^^Aendgroup % \chardef\noetex 0 \ifx\numexpr\undefined\chardef\noetex 1 \fi \ifnum\noetex=1 \chardef\extractfiles 0 % extract files, then stop \else \ifx\ProvidesFile\undefined \chardef\extractfiles 0 % etex etc.. on \pkgname.dtx, only file extraction. \else % latex/pdflatex on \pkgname.tex or on \pkgname.dtx \ifx\Withdvipdfmx\undefined % latex/pdflatex run is on \pkgname.dtx \chardef\extractfiles 1 % 1 = extract files and typeset manual, 2 = only typeset \chardef\Withdvipdfmx 0 % 0 = pdflatex or latex+dvips, 1 = dvipdfmx \chardef\NoSourceCode 0 % 0 = include source code, 1 = do not \NeedsTeXFormat {LaTeX2e}% \PassOptionsToClass {a4paper,fontsize=11pt,oneside}{scrdoc}% \PassOptionsToPackage {english}{babel}% \else % latex run is on \pkgname.tex \chardef\extractfiles 2 % do not extract files, only typeset \fi \ProvidesFile{\pkgname.dtx}% [\pkgname\space source and documentation (\dtxtimestamp)]% \fi \fi \ifnum\extractfiles<2 % extract files \def\MessageDeFin{\newlinechar10 \let\Msg\message \Msg{********************************************************************^^J}% \Msg{*^^J}% \Msg{* To finish the installation you have to move the following^^J}% \Msg{* file into a directory searched by TeX:^^J}% \Msg{*^^J}% \Msg{*\space\space\space\space \pkgname.sty^^J}% \Msg{*^^J}% \Msg{* To produce the documentation with source code included run latex^^J}% \Msg{* twice on file \pkgname.tex and then dvipdfmx on \pkgname.dvi^^J}% \Msg{*^^J}% \Msg{* Happy TeXing!^^J}% \Msg{*^^J}% \Msg{********************************************************************^^J}% }% \begingroup \input docstrip.tex \askforoverwritefalse \def\pkgpreamble{\defaultpreamble^^J\MetaPrefix^^J% \string\NeedsTeXFormat{LaTeX2e}^^J% \string\ProvidesPackage{\pkgname}\perCent^^J% \space[\pkgdate\space\pkgversion\space\pkgdescription]}% \generate{\nopreamble\nopostamble \file{README.md}{\from{\pkgname.dtx}{readme}}% \usepostamble\defaultpostamble \file{\pkgname.ins}{\from{\pkgname.dtx}{insfile}}% \file{\pkgname.tex}{\from{\pkgname.dtx}{tex}}% \usepreamble\pkgpreamble \file{\pkgname.sty}{\from{\pkgname.dtx}{package}}}% \endgroup \fi % end of file extraction (from etex/latex/pdflatex run on \pkgname.dtx) \ifnum\extractfiles=0 % tex/etex/xetex/etc on \pkgname.dtx, files extracted, stop \MessageDeFin\expandafter\end \fi % From this point on, run is necessarily with e-TeX. % Check if \MessageDeFin got defined, if yes put it at end of run. \ifdefined\MessageDeFin\AtEndDocument{\MessageDeFin}\fi %------------------------------------------------------------------------------- % START OF USER MANUAL TEX SOURCE \documentclass[abstract]{scrdoc} \ifnum\NoSourceCode=1 \OnlyDescription\fi \usepackage{ifpdf} \ifpdf\chardef\Withdvipdfmx 0 \fi \makeatletter \ifnum\Withdvipdfmx=1 \@for\@tempa:=hyperref,bookmark,graphicx,xcolor,pict2e\do {\PassOptionsToPackage{dvipdfmx}\@tempa} % \PassOptionsToPackage{dvipdfm}{geometry} \PassOptionsToPackage{bookmarks=true}{hyperref} \PassOptionsToPackage{dvipdfmx-outline-open}{hyperref} \PassOptionsToPackage{dvipdfmx-outline-open}{bookmark} % \def\pgfsysdriver{pgfsys-dvipdfm.def} \else \PassOptionsToPackage{bookmarks=true}{hyperref} \fi \makeatother \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage {babel} \usepackage[hscale=0.72,vscale=0.7]{geometry} \def\MacroFont{\ttfamily\small\hyphenchar\font45 \baselineskip11pt\relax} \usepackage{amsmath} \usepackage{newtxtext, newtxmath} \usepackage[straightquotes, scaled=0.97]{newtxtt} \usepackage{xspace} \usepackage[dvipsnames]{xcolor} \definecolor{joli}{RGB}{225,95,0} \definecolor{JOLI}{RGB}{225,95,0} \definecolor{BLUE}{RGB}{0,0,255} \colorlet{niceone}{green!35!blue!75} \usepackage{framed} \usepackage[pdfencoding=pdfdoc]{hyperref} \hypersetup{% linktoc=all,% breaklinks=true,% colorlinks,% linkcolor=RoyalBlue,% urlcolor=OliveGreen,% pdfauthor={Jean-Fran\c cois Burnol},% pdftitle={The \pkgname\space package},% pdfsubject={\pkgdescription},% pdfkeywords={LaTeX, footnotes},% pdfstartview=FitH,% pdfpagemode=UseNone} % added usage of package bookmark 2013/10/10 \usepackage{bookmark} \usepackage{enumitem} \usepackage{\pkgname} \newcommand\fnh{% \texorpdfstring{{\color{joli}\ttfamily\bfseries \pkgname}}{\pkgname}\xspace} \frenchspacing \renewcommand\familydefault\sfdefault \pagestyle{headings} \begin{document}\thispagestyle{empty} % the \MacroFont valid at begin document will be the one used in Implementation % the one defined here will be used by verbatim (not by \verb) \def\MacroFont{\ttfamily\small} \rmfamily \bookmark[named=FirstPage,level=1]{Title page} \begin{center} {\normalfont\LARGE The \fnh package}\\ \textsc{\small Jean-François Burnol}\par \footnotesize \ttfamily jfbu (at) free (dot) fr\par Package version: \pkgversion\ (\pkgdate)\par From source file \texttt{\pkgname.dtx} of \dtxtimestamp.\par \end{center} \MakeShortVerb{\`}% \begin{abstract} The `footnote` package by \textsc{Mark~Wooding} (`1997/01/28` `1.13`) allows to gather footnotes (`\begin{savenotes}`) and later insert them (after `\end{savenotes}`) at the bottom of the page, even if the intervening material consists of tabulars, minipages or framed contents for example. One can also use the `\savenotes/\spewnotes` syntax. Also, `footnote.sty` provides a `footnote` environment which allows to insert verbatim material. Earlier releases of the present \fnh package added patches for `hyperref` compatibility and some bugfixes, addressing in particular the incompatibility with `color/xcolor`, and with `babel-frenchb`, and also fixing the `footnote` environment with optional argument `[NUM]`. Since `v0.99` all macros are defined internally and the `footnote` package is not loaded at all. The same user interface is kept. Since `v1.0` it is possible to use \fnh also in absence of `hyperref` or when the latter is loaded with its `hyperfootnotes=false` option. The order of loading of \fnh and `hyperref` is inconsequential. \end{abstract} \DeleteShortVerb{\`} \section{License} \begingroup\ttfamily\footnotesize\hyphenchar\font -1 \parindent0pt \obeyspaces\obeylines % \pkgLicense\endgroup \section{Usage} Since |v0.99|, \fnh does not load package |footnote.sty|\footnote{\url{http://ctan.org/pkg/footnote}} anymore, and is even incompatible with it at it uses the same user interface. Since |v1.0|, \fnh is usable also in absence of |hyperref| or when the latter was passed |hyperfootnotes=false| option. Version |v1.1| fixes a bug which arose when |savenotes| environment was used \emph{inside} a minipage: footnotes were disappearing!% % \footnote{Thanks to François Pantigny for reporting the bug.} % See related remarks at end of \autoref{sec:notes}. The package thus provides: \begin{itemize} \item a |savenotes| environment which re-routes footnotes and delivers them at the end (there is also the |\savenotes/\spewnotes| syntax; it does create a group like the environment), \item |footnote| and |footnotetext| environments to allow footnotes with verbatim material. \end{itemize} But the constructability of the |footnote/footnotetext| environments depends on how |\@makefntext| has been customized by the class or other packages; a warning is issued if the situation appears to be desperate.\footnote{original |footnote.sty| could end up in a low level \TeX\ error.} It should be recalled that in case of |\footnotemark[N]| and |\footnotetext[N]{...}| mark-up |hyperref| creates no hyperlink. This is not changed by \fnh and applies also to the |\begin{footnotetext}[N]| case. Without optional argument the link is created, and the link is created also for |\footnote[N]| or |\begin{footnote}[N]|. This package does not handle especially floating environments, except that one can always surround them in the source in a |savenotes| environment and one knows that the footnotes will be delivered at the |\end{savenotes}|\dots which may well be one page earlier than the actual location of the floating material in the produced document ! Environments typesetting multiple times their contents are the most hostile to footnotes. Currently, \fnh only handles especially the |amsmath| environments (as in |footnote.sty|.) Finally there is a |\makesavenoteenv| command which takes as argument an environment name and patches it to do the |\savenotes/\spewnotes| automatically.% \begin{footnote} For the record the syntax is either |\makesavenoteenv{foo}| which patches environment |foo| or |\makesavenoteenv[bar]{foo}| which defines environment |bar| as this patched version of |foo|. \end{footnote} It is safer to avoid it, as one never knows what happens with such patches: for example the |[H]| specifier provided by the |float| package overwrites the |\end{table}| definition during the execution of |\begin{table}|\dots ! \begin{savenotes} \begin{framed} \DeleteShortVerb{\|}\MakeShortVerb{\*}% {\centering \begin{tabular}{|c|c|} \hline \strut Inside\footnote{Notice that as frame extended to the next page, the end of the *savenotes* environment delivered its footnotes only here.} a & tabular\begin{footnote}Alternatively a *\savenotes/\spewnotes* pair could have been used.\end{footnote}\\\hline \end{tabular}\par} \DeleteShortVerb{\*}\MakeShortVerb{\|}% An example: \begin{verbatim} \begin{savenotes} \begin{framed} Please refer to the documentation of the |footnote| package.% \footnote{\url{http://ctan.org/pkg/footnote}} Particularly you may check its |savenotes| environment.% \footnote{It doesn't bring any feature to especially handle the issues related to footnotes in floating environments, though.} \end{framed} \end{savenotes} \end{verbatim} and the present frame has \cs{footnote}'s from inside a |tabular| and is inside a |savenotes| environment.% \begin{footnote} Here is an issue which has nothing (as I finally figured out) to do with |footnote|, and only indirectly with \LaTeX: if you embed a \emph{full-width} minipage (with initial \cs{noindent}) in any environment not doing \cs{ignorespacesafterend}, be careful to add a \% either immediately after the |\end{minipage}| (or a |\relax| or a |\par|) or after the surrounding environment |\end{foo}| or use |\end{minipage}\end{foo}| else the output may have an extra blank line if the source has a blank line after the |foo| environment. Here is a typical example, with a |tabular| rather: \makeatletter \medskip\noindent\hspace{1cm}\begin{minipage}{\dimexpr\linewidth-1cm}% \def\MacroFont{\baselineskip10pt\relax}% \begin{verbatim} \newenvironment{foo}{}{} \noindent\begin{tabular}{p{\dimexpr\linewidth-2\tabcolsep\relax}} A\dotfill B \end{tabular} C \begin{foo} \noindent\begin{tabular}{p{\dimexpr\linewidth-2\tabcolsep\relax}} A\dotfill B \end{tabular} \end{foo} C \end{verbatim}\end{minipage}\par\medskip If you try it out you will see an extra blank line in PDF output above the second C. Starting with |v0.99| the |\end{savenotes}| emits an \cs{ignorespacesafterend} which avoids this generic \TeX/\LaTeX\ problem. For good measure there is now an \cs{ignorespaces} in |\begin{savenotes}|. \end{footnote} Let's test an |amsmath| environment with |\intertext|. As \begin{align} E&=mc^2\;, \intertext{was too easy\footnote{There is also $E=h\nu$.}, let's try:} a^n + b^n &=c^n\;. \end{align} And a footnote with some verbatim material% \begin{footnote} \verb|&$^%\[}$| \end{footnote}. \end{framed} \end{savenotes} The last one was coded as: \begin{verbatim} And a footnote with some verbatim material% \begin{footnote} \verb|&$^%\[}$| \end{footnote}. \end{verbatim} Now some use of |\footnotemark|\footnotemark\ followed by a |footnotetext| environment. \begin{footnotetext} This one uses the normal footnote counter and the hyperlink works. \end{footnotetext} And use of |\footnotemark[99]|\footnotemark[99] in association with a |footnotetext| environment using the same optional argument |[99]|. No hyperfootnote link was inserted.% \begin{footnotetext}[99] |hyperref| creates no hyperlink in this case, or in the |\footnotemark[N]/\footnotetext[N]{}| case. It does when the |[N]| is absent or when it is used with a |\footnote| command (or a |footnote| environment.) By the way, \fnh |v0.9f|'s |\footnotetext[N]| and |\begin{footnotetext}[N]| each had a bug and they were unusable \emph{inside} the |savenotes| environment. There was no issue \emph{outside}. \end{footnotetext} And a final footnote, done with |\begin{footnote}[57]|% \begin{footnote}[57]\csname @minipagetrue\endcsname % to reduce % framed inserted vertical spacing \begin{framed} \noindent\fnh works since |v1.0| also in absence of |hyperref| or when the latter was passed |hyperfootnotes=false| option. \end{framed} \end{footnote}. There is no problem with the hyperlink, then. \section{Notes}\label{sec:notes} A few items worth of mention: \begin{itemize}[nosep] \item the |footnote| package patches the \LaTeX\ kernel |\parbox|. \fnh doesn't (but the code can be found commented-out at the end of the present file). \item the |footnote| package defines a |minipage*| environment which is |minipage| patched by |\makesavenoteenv|, \fnh doesn't. \item the |footnote| environment from |footnote.sty| does a |\leavevmode\unskip| which \fnh doesn't: hence if one locates |\begin{footnote}| at start of a line in the \LaTeX\ source, one will typically need a \% at end of text on previous line to avoid the end-of-line space. \item the |hyperref| package inserts no hyperlink in case of |\footnotemark[N]/\footnotetext[N]|. This is not modified by \fnh. \item side-note: there is an interference between |hyperref| and |frenchb| regarding the footnote marker when using the syntax |\footnotemark[NUM]|. For the record here is a patch (last tested briefly with % PUTAIN BORDEL ! LaTeX Error: Text for \verb command ended by end of % line. À CHAQUE FOIS ÇA M'AGAÇE. Bon, je n'ai pas mon patch habituel ici. |hyperref 2016/06/24 v6.83q| and |frenchb 2017/01/30 v3.2g|): % pour le cas où mis dans commentaires de code % \begingroup\makeatletter\let\check@percent\@gobble \begin{verbatim} \AtBeginDocument{% \let\@xfootnotemarkORIFB \@xfootnotemark \def\@xfootnotemarkFB {\leavevmode\unskip\unkern\,\@xfootnotemarkORIFB }% \ifHy@hyperfootnotes\ifFBAutoSpaceFootnotes \let\@xfootnotemark\@xfootnotemarkFB \fi\fi }% \end{verbatim} % \endgroup \item some environments typeset multiple times their contents, which causes issues; \fnh takes provisions only to handle the |amsmath| measuring step. \item \LaTeX2e has some features when using footnotes in |minipage|'s which are themselves in a |minipage| which may also have footnotes externally to the internal minipages... try it out with some |\fbox|es around the sub-|minipages|, to see. \fnh behaves like original package |footnote| in such contexts. Only reasonable usage seems to embed the entire contents of the external minipage in a |savenotes| environment. But there will anyhow be collisions of the alphabetic enumerations. These collisions are there with or without \fnh (or |footnote.sty|.) I did not make any attempt, nor intend to in future, to address in an automatized manner these problematic contexts. \end{itemize} \StopEventually{\end{document}\endinput} \makeatletter \let\check@percent\original@check@percent \makeatother \newgeometry{left=4cm, hscale=0.72} \section{Implementation} \small \makeatletter \noindent \begingroup \topsep\MacrocodeTopsep \trivlist\parskip\z@\item[] \macro@font \leftskip\@totalleftmargin \advance\leftskip\MacroIndent \rightskip\z@ \parindent\z@ \parfillskip\@flushglue \global\@newlistfalse \global\@minipagefalse \ifcodeline@index \everypar{\global\advance\c@CodelineNo\@ne \llap{\theCodelineNo\ \hskip\@totalleftmargin}}% \fi \string\NeedsTeXFormat\string{LaTeX2e\string}\par \string\ProvidesPackage\string{\pkgname\string}\@percentchar\par \noindent\space [\pkgdate\space\pkgversion\space\pkgdescription]\par \nointerlineskip \global\@inlabelfalse \endtrivlist \endgroup \makeatother % The catcode hackery next is to avoid to have <*package> to be listed % in the commented source code... % (c) 2012/11/19 jf burnol ;-) \MakePercentIgnore % % \catcode`\<=0 \catcode`\>=11 \catcode`\*=11 \catcode`\/=11 % \let\relax % \def<*package>{\catcode`\<=12 \catcode`\>=12 \catcode`\*=12 \catcode`\/=12} % % %<*package> % \begin{macro}{no options} % The package has no options. % \begin{macrocode} \DeclareOption*% {\PackageWarning{footnotehyper}{Option `\CurrentOption' is unknown}}% \ProcessOptions\relax % \end{macrocode} % \end{macro} % Versions up to |v0.9f| loaded |footnote.sty|, with lots of patching % afterwards. Starting with |v0.99|, \fnh does everything by itself with |FNH@| % prefix. Brief overview of some of the fixed issues: % \begin{itemize}[nosep] % \item there was incompatibility with |hyperref|, % \item and with |color|, % \item if the \cs{@makefntext} at the time of loading of |footnote.sty| % does not have its argument visible at top level in its meaning, or % is used multiple times there, then the footnote environment will lead to low % level \TeX\ error, % \item |footnote.sty| modifies |\parbox|, % \item |footnote.sty| does some too early |\let|, % \item the footnote environment from |footnote.sty| does not work if used with % optional argument |[N]|. % \end{itemize} % % \noindent Starting with |v1.0|, \fnh may be used also in absence % of |hyperref|. % \begin{macrocode} \newbox\FNH@notes \newdimen\FNH@width \let\FNH@colwidth\columnwidth \newif\ifFNH@savingnotes \AtBeginDocument {% \let\FNH@latex@footnote \footnote \let\FNH@latex@footnotetext\footnotetext \let\FNH@H@@footnotetext \@footnotetext \let\FNH@H@@mpfootnotetext \@mpfootnotetext \newenvironment{savenotes} {\FNH@savenotes\ignorespaces}{\FNH@spewnotes\ignorespacesafterend}% \let\spewnotes \FNH@spewnotes \let\footnote \FNH@footnote \let\footnotetext \FNH@footnotetext \let\endfootnote \FNH@endfntext \let\endfootnotetext\FNH@endfntext \@ifpackageloaded{hyperref} {\ifHy@hyperfootnotes \let\FNH@H@@footnotetext\H@@footnotetext \let\FNH@H@@mpfootnotetext\H@@mpfootnotetext \else \let\FNH@hyper@fntext\FNH@nohyp@fntext \fi}% {\let\FNH@hyper@fntext\FNH@nohyp@fntext}% }% % \end{macrocode} % \begin{macro}{\FNH@hyper@fntext} % \begin{macro}{\FNH@nohyp@fntext} % \begin{macro}{\FNH@fntext} % These are the \fnh replacement for |\@footnotetext| inside the % |savenotes| environment. There is a version creating an hyperlink % and another one not creating an hyperlink. The \cs{FNH@fntext} % macro serves as general dispatch. This may be a place to customize if one % wants to handle environments doing multiple passes: but the footnote counter % must have been taken care of elsewhere. The code currently handles only % the case of |amsmath| environments. % \begin{macrocode} \def\FNH@hyper@fntext{\FNH@fntext\FNH@hyper@fntext@i}% \def\FNH@nohyp@fntext{\FNH@fntext\FNH@nohyp@fntext@i}% \def\FNH@fntext #1{\ifx\ifmeasuring@\@undefined \expandafter\@secondoftwo\else\expandafter\@firstofone\fi {\ifmeasuring@\expandafter\@gobbletwo\fi}#1% }% % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \begin{macro}{\FNH@hyper@fntext@i} % We do the \cs{ifHy@nesting} test although hyperref's manual % says ``Allows links to be nested; no drivers currently support this.'' % \begin{macrocode} \long\def\FNH@hyper@fntext@i#1{% \global\setbox\FNH@notes\vbox {\unvbox\FNH@notes \FNH@startnote \@makefntext {\rule\z@\footnotesep\ignorespaces \ifHy@nesting\expandafter\ltx@firstoftwo \else\expandafter\ltx@secondoftwo \fi {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}{#1}}% {\Hy@raisedlink {\expandafter\hyper@@anchor\expandafter{\Hy@footnote@currentHref}% {\relax}}% \let\@currentHref\Hy@footnote@currentHref \let\@currentlabelname\@empty #1}% \@finalstrut\strutbox }% \FNH@endnote }% }% % \end{macrocode} % \end{macro} % \begin{macro}{\FNH@nohyp@fntext@i} % The original \cs{fn@fntext} had no \cs{long}. % \begin{macrocode} \long\def\FNH@nohyp@fntext@i#1{% \global\setbox\FNH@notes\vbox {\unvbox\FNH@notes \FNH@startnote \@makefntext{\rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% \FNH@endnote }% }% % \end{macrocode} % \end{macro} % \begin{macro}{\FNH@startnote} % Same as original (the code comment is kept from original.) % \begin{macrocode} \def\FNH@startnote{% \hsize\FNH@colwidth \interlinepenalty\interfootnotelinepenalty \reset@font\footnotesize \floatingpenalty\@MM% Is this right??? \@parboxrestore \protected@edef\@currentlabel{\csname p@\@mpfn\endcsname\@thefnmark}% \color@begingroup }% % \end{macrocode} % \end{macro} % \begin{macro}{\FNH@endnote} % Fixed from original. % \begin{macrocode} \def\FNH@endnote{\color@endgroup}% % \end{macrocode} % \end{macro} % \begin{macro}{\FNH@savenotes} % Same as original apart from using |hyperref|-aware \cs{FNH@hyper@fntext}, % and taking into account |hyperref|'s custom \cs{@xfootnotetext}. This was % missed by |v0.9f| hence |\footnotetext[N]{..}| did not work % inside |savenotes| environment. Fixed for |v0.99|. % % Maybe I should change the way \cs{@minipagerestore} is handled. % \begin{macrocode} \def\FNH@savenotes{% \begingroup \ifFNH@savingnotes\else \FNH@savingnotestrue \let\@footnotetext \FNH@hyper@fntext \let\@mpfootnotetext \FNH@hyper@fntext \let\H@@mpfootnotetext\FNH@nohyp@fntext % fool hyperref's \@xfootnotenext \FNH@width\columnwidth \let\FNH@colwidth\FNH@width \global\setbox\FNH@notes\box\voidb@x \let\FNH@thempfn\thempfn \let\FNH@mpfn\@mpfn \ifx\@minipagerestore\relax\let\@minipagerestore\@empty\fi \expandafter\def\expandafter\@minipagerestore\expandafter{% \@minipagerestore \let\thempfn\FNH@thempfn \let\@mpfn\FNH@mpfn }% \fi }% % \end{macrocode} % \end{macro} % \begin{macro}{\FNH@spewnotes} % This uses \cs{FNH@H@@footnotetext} which is the % \cs{H@@footnotetext} |hyperref|'s preserved original % meaning of \cs{@footnotetext} not creating a link target. % % |v1.1| fixes the bug about disappearing footnotes if |savenotes| environment % is used inside a minipage. I had never really considered such usage, hence % missed realizing there was a bug. % \begin{macrocode} \def\FNH@spewnotes {% \endgroup \ifFNH@savingnotes\else \ifvoid\FNH@notes\else \begingroup \let\@makefntext\@empty \let\@finalstrut\@gobble \let\rule\@gobbletwo \ifx\@footnotetext\@mpfootnotetext \expandafter\FNH@H@@mpfootnotetext \else \expandafter\FNH@H@@footnotetext \fi{\unvbox\FNH@notes}% \endgroup \fi \fi }% % \end{macrocode} % \end{macro} % \begin{macro}{\FNH@footnote} % \begin{macro}{\FNH@footnotetext} % We now take care of |footnote.sty|'s |footnote| environment. The original % \cs{fn@endfntext} is lacking a \cs{fn@endnote}, and this meant that % |footnote.sty| was incompatible with |color/xcolor| packages. Also this % \cs{fn@endnote} was |\let| to |\color@endgroup| which is wrong. % % Furthermore, independently of presence of the |\color/xcolor| issue, the % |footnote.sty|'s |footnote| environment raised an error if used with an % optional argument. |v0.9f| addresses this issue. % % The |footnotetext| environment adds a complication, in case of optional % argument we should not try to set up a link due to the fact that |hyperref| % does not support it for the |\footnotemark[N]/\footnotetext[N]| syntax. % And we need to make sure that the |footnote| and |footnotetext| environments % obey the |\savenotes/\spewnotes| mechanism. % % To handle all of this we code things completely differently from % |footnote.sty|. % % The |v0.9f| |\begin{footnotetext}[N]| inside |savenotes| tried to create % an hyperref target. Fixed for |v0.99|. % % Note: the |footnote.sty| code did a |\leavevmode\unskip| at entrance of % |footnote| environment, which \fnh has not kept. % \begin{macrocode} \def\FNH@footnote@envname {footnote}% \def\FNH@footnotetext@envname{footnotetext}% \def\FNH@footnote{% \ifx\@currenvir\FNH@footnote@envname \expandafter\FNH@footnoteenv \else \expandafter\FNH@latex@footnote \fi }% \def\FNH@footnoteenv{% \@ifnextchar[% \FNH@footnoteenv@i %] {\stepcounter\@mpfn \protected@xdef\@thefnmark{\thempfn}% \@footnotemark \def\FNH@endfntext@fntext{\@footnotetext}% \FNH@startfntext}% }% \def\FNH@footnoteenv@i[#1]{% \begingroup \csname c@\@mpfn\endcsname #1\relax \unrestored@protected@xdef\@thefnmark{\thempfn}% \endgroup \@footnotemark \def\FNH@endfntext@fntext{\@footnotetext}% \FNH@startfntext }% \def\FNH@footnotetext{% \ifx\@currenvir\FNH@footnotetext@envname \expandafter\FNH@footnotetextenv \else \expandafter\FNH@latex@footnotetext \fi }% \def\FNH@footnotetextenv{% \@ifnextchar[% \FNH@footnotetextenv@i %] {\protected@xdef\@thefnmark{\thempfn}% \def\FNH@endfntext@fntext{\@footnotetext}% \FNH@startfntext}% }% \def\FNH@footnotetextenv@i[#1]{% \begingroup \csname c@\@mpfn\endcsname #1\relax \unrestored@protected@xdef\@thefnmark{\thempfn}% \endgroup \ifFNH@savingnotes \def\FNH@endfntext@fntext{\FNH@nohyp@fntext}% \else \def\FNH@endfntext@fntext{\FNH@H@@footnotetext}% \fi \FNH@startfntext }% % \end{macrocode} % \end{macro}\end{macro} % \begin{macro}{\FNH@startfntext} % \begin{macro}{\FNH@endfntext} % \begin{macro}{\FNH@endfntext@fntext} % This is used for the environmental form of the footnote environments. % The use of |\box\z@| originates in |footnote.sty|, should I change that ? % % Both of \cs{endfootnote} and \cs{endfootnotetext} are aliases for % \cs{FNH@endfntext}. % % The \cs{FNH@endfntext@fntext} may be \cs{@footnotetext} (which will be % \cs{FNH@hyper@fntext} in |savenotes| environment), or % \cs{FNH@H@@footnotetext}, or \cs{FNH@nohyp@fntext} if in |savenotes| scope. % \begin{macrocode} \def\FNH@startfntext{% \setbox\z@\vbox\bgroup \FNH@startnote \FNH@prefntext \rule\z@\footnotesep\ignorespaces }% \def\FNH@endfntext {% \@finalstrut\strutbox \FNH@postfntext \FNH@endnote \egroup \begingroup \let\@makefntext\@empty\let\@finalstrut\@gobble\let\rule\@gobbletwo \FNH@endfntext@fntext {\unvbox\z@}% \endgroup }% % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \begin{macro}{\@makefntext} % \begin{macro}{\FNH@prefntext} % \begin{macro}{\FNH@postfntext} % The definitions of |\FNH@prefntext| and |\FNH@postfntext| (which are needed % for the |footnote| environment, |\FNH@startfntext| and |\FNH@endfntext|) % are extracted from a somewhat daring analysis of |\@makefntext|. % Contrarily to |footnote.sty|'s original code (which may result in low level % \TeX\ errors when the |footnote| environment is executed) % the method here will alert the user if the argument % of |\@makefntext| is not visible at top level in its meaning or is used % there multiple times. We also insert here some code to handle especially % the case of |babel-frenchb|. % \begin{macrocode} \AtBeginDocument{\let\FNH@@makefntext\@makefntext \ifx\@makefntextFB\undefined \expandafter\@gobble\else\expandafter\@firstofone\fi {\ifFBFrenchFootnotes \let\FNH@@makefntext\@makefntextFB \else \let\FNH@@makefntext\@makefntextORI\fi}% \expandafter\FNH@check@a\FNH@@makefntext{1.2!3?4,}% \FNH@@@1.2!3?4,\FNH@@@\relax }% \long\def\FNH@check@a #11.2!3?4,#2\FNH@@@#3{% \ifx\relax#3\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi \FNH@bad@makefntext@alert {\def\FNH@prefntext{#1}\def\FNH@postfntext{#2}\FNH@check@b}% }% \def\FNH@check@b #1\relax{% \expandafter\expandafter\expandafter\FNH@check@c \expandafter\meaning\expandafter\FNH@prefntext \meaning\FNH@postfntext1.2!3?4,\FNH@check@c\relax }% \def\FNH@check@c #11.2!3?4,#2#3\relax{% \ifx\FNH@check@c#2\expandafter\@gobble\fi\FNH@bad@makefntext@alert }% \def\FNH@bad@makefntext@alert{% \PackageWarningNoLine{footnotehyper}% {^^J The footnote environment will not be fully functional, sorry.^^J You may try to email the author with the following information:}% \typeout{\meaning\@makefntext}% \let\FNH@prefntext\@empty\let\FNH@postfntext\@empty }% % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \begin{macro}{\makesavenoteenv} % Same as original. Not recommended. Safer to use explicitely % |savenotes| environment. % \begin{macrocode} \def\makesavenoteenv{\@ifnextchar[\FNH@msne@ii\FNH@msne@i}%] \def\FNH@msne@i #1{% \expandafter\let\csname FNH$#1\expandafter\endcsname %$ \csname #1\endcsname \expandafter\let\csname endFNH$#1\expandafter\endcsname %$ \csname end#1\endcsname \FNH@msne@ii[#1]{FNH$#1}%$ }% \def\FNH@msne@ii[#1]#2{% \expandafter\edef\csname#1\endcsname{% \noexpand\savenotes \expandafter\noexpand\csname#2\endcsname }% \expandafter\edef\csname end#1\endcsname{% \expandafter\noexpand\csname end#2\endcsname \noexpand\expandafter \noexpand\spewnotes \noexpand\if@endpe\noexpand\@endpetrue\noexpand\fi }% }% % \end{macrocode} % \end{macro} % Original footnote.sty patches |\parbox|, we don't touch it. Also it defines a % |minipage*| environment, we don't do it. % \begin{macrocode} % \makesavenoteenv[minipage*]{minipage} % \let\fn@parbox\parbox % \def\parbox{\@ifnextchar[{\fn@parbox@i{}}{\fn@parbox@ii{}}} % \def\fn@parbox@i#1[#2]{% % \@ifnextchar[{\fn@parbox@i{#1[#2]}}{\fn@parbox@ii{#1[#2]}}% % } % \long\def\fn@parbox@ii#1#2#3{\savenotes\fn@parbox#1{#2}{#3}\spewnotes} \endinput % \end{macrocode} % \MakePercentComment \Finale %% %% End of file `footnotehyper.dtx'.