% \iffalse meta comment % File: fnbreak.dtx Copyright (C) 2003, 2004 Harald Harders % \fi % % \iffalse % %<*driver> \documentclass{ltxdoc} \title{The \texttt{fnbreak} package} \author{Harald Harders\\\texttt{h.harders@tu-bs.de}} \date{Version \fileversion, \filedate, Printed \today} \EnableCrossrefs \CodelineIndex \DoNotIndex{\def,\edef,\let,\newcommand,\newenvironment,\newcounter} \DoNotIndex{\setcounter,\space} \CodelineNumbered \RecordChanges \CheckSum{132} \IfFileExists{fnbreak-v.tex}{% \input{fnbreak-v.tex} \GetFileInfo{fnbreak-v.tex} }{% \PackageError{fnbreak}{File fnbreak-v.tex not found, please\MessageBreak run `latex fnbreak.ins' first}{No additional help}% \def\fileversion{\textbf{??}}% \def\filedate{\textbf{??}}% } \begin{document} \DocInput{fnbreak.dtx} \end{document} % % \fi % % \changes{0.01}{2003/04/03}{First version} % % \maketitle % \begin{abstract} % \noindent This package detects footnotes that are split over several % pages. It writes a warning into the log file. % \end{abstract} % % \tableofcontents % % \section*{Copyright} % Copyright 2003, 2004 Harald Harders. % % 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.3 of the License, or any later version. % % \section{The user interface} % % To use this package place %\begin{verbatim} %\usepackage{fnbreak} %\end{verbatim} % in the preamble of your document. % % If a footnote is split over a page break, a warning like the % following is put into the log: %\begin{verbatim} %Package fnbreak Warning: Footnote number 1 (label `a') %(fnbreak) has been split over different pages: %(fnbreak) page 1 to page 2. %\end{verbatim} % Sometimes, complicated footnote labels are used (for example, when % using symbols): %\begin{verbatim} %Package fnbreak Warning: Footnote number 1 (label `\ensuremath {*}') %(fnbreak) has been split over different pages: %(fnbreak) page 1 to page 2. %\end{verbatim} % In some cases may this even break the function. % To avoid these problems, you may give the package option |nolabel|: %\begin{verbatim} %\usepackage[nolabel]{fnbreak} %\end{verbatim} % Then the label is omitted in the warning: %\begin{verbatim} %Package fnbreak Warning: Footnote number 1 %(fnbreak) has been split over different pages: %(fnbreak) page 1 to page 2. %\end{verbatim} % % When using the package option |verbose| the fnbreak package writes a % message for every footnote, even if it is completely on one page. % % \StopEventually{\PrintChanges \PrintIndex} % % \section{The implementation} % % The approach of this package is very simple: % At the begin and the end of each footnote text, the footnote number % and current page are written to the aux file. Then, it is tested if % both pages are the same for each footnote. % % Heading of the package: % \begin{macrocode} %\ProvidesPackage{fnbreak} %\ProvidesFile{fnbreak-v.tex} % [2004/04/06 v1.10 Warning for pagebreak in footnote (HH)] %<*package> % \end{macrocode} % Declare an option to show not only the footnote number but also the % label. % \changes{1.10}{2004/04/06}{Add option `verbose'}% % \begin{macrocode} \newif\iffnb@showlabel \fnb@showlabeltrue \newif\iffnb@verbose \DeclareOption{nolabel}{\fnb@showlabelfalse} \DeclareOption{verbose}{\fnb@verbosetrue} \ProcessOptions\relax % \end{macrocode} % Define default values in order to avoid possible problems: % \changes{1.00}{2004/04/01}{Correct some internal macro names}% % \begin{macrocode} \xdef\fnb@@footnotestartnum{0} \xdef\fnb@@footnotestartpage{0} % \end{macrocode} % When the aux file is read the first time (before \cs{begin\{document\}}, % do nothing: % \begin{macrocode} \def\fnb@footnotestart#1#2#3{} \def\fnb@footnoteend#1#2#3{} % \end{macrocode} % Define the working commands at \cs{begin\{document\}} in order to % activate them when the aux file is read at the end of the document: % \begin{macrocode} \AtBeginDocument{% % \end{macrocode} % If the start of a footnote has been found, just define commands % containing the footnote number (only for debugging) and the start page: % \begin{macrocode} \def\fnb@footnotestart#1#2#3{% \xdef\fnb@@footnotestartnum{#1}% \xdef\fnb@@footnotestartpage{#3}% }% % \end{macrocode} % \changes{1.00}{2004/04/01}{No need to have numerical page numbers % anymore}% % \changes{1.00}{2004/04/01}{Use the footnote number instead of the % label, show both in the warning}% % If the end of a footnote has been found, test wheather the footnote % numbers fit and wheather the start and end pages are the same. If % one of the tests fails, generate a warning:\footnote{Thanks to % Bastien Roucaries for pointing at a problem with symbol footnote % marks.} % \begin{macrocode} \def\fnb@footnoteend#1#2#3{% \xdef\fnb@@footnoteendnum{#1}% \xdef\fnb@@footnoteendpage{#3}% % \end{macrocode} % Test if start and end refer to the same footnote. % \begin{macrocode} \ifx\fnb@@footnotestartnum\fnb@@footnoteendnum % \end{macrocode} % Test if the footnote ends on the same page it has started. % \begin{macrocode} \ifx\fnb@@footnotestartpage\fnb@@footnoteendpage % \end{macrocode} % Yes, the footnote is completely on one page. % Print a message if |verbose| mode is requested. % \begin{macrocode} \iffnb@verbose \message{Package fnbreak: Footnote number #1 \iffnb@showlabel(label `#2') \fi^^J% \space\space\space\space\space\space \space\space\space\space\space\space \space\space\space\space\space completely on page #3.}% \fi \else % \end{macrocode} % No, the footnote contains a pagebreak. % Print a warning. % \begin{macrocode} \PackageWarningNoLine{fnbreak}{Footnote number #1 \iffnb@showlabel(label `#2')\fi \MessageBreak has been split over different pages:\MessageBreak page \fnb@@footnotestartpage\space to page #3}% % \end{macrocode} % Redefine the \cs{fnb@globalwarning} to print a warning at the end of % the log file. % \begin{macrocode} \def\fnb@globalwarning{% \PackageWarningNoLine{fnbreak}{There are footnotes with a pagebreak.\MessageBreak Check if they are acceptable}% }% \fi \else % \end{macrocode} % This macro trys to handle different footnotes. % This may not happen and is an internal error. % \begin{macrocode} \PackageError{fnbreak}{Internal problem:\MessageBreak Start and stop marker of footnote do not fit:\MessageBreak start: \fnb@@footnotestartnum, page \fnb@@footnotestartpage, end: #1, page #3}{% This error may not happen. Please try to make a short example which shows this behaviour and send a bug report to h.harders@tu-bs.de.}% \fi }% } % \end{macrocode} % Define command that writes the footnote start marker to the aux % file: % \begin{macrocode} \def\fnb@fnstart{\@bsphack \protected@write\@auxout{}{% \string\fnb@footnotestart{\the\c@footnote}{\thefootnote}{\thepage}% }% \@esphack } % \end{macrocode} % Define command that writes the footnote end marker to the aux file: % \begin{macrocode} \def\fnb@fnend{\@bsphack \protected@write\@auxout{}{% \string\fnb@footnoteend{\the\c@footnote}{\thefootnote}{\thepage}% }% \@esphack } % \end{macrocode} % \changes{1.00}{2004/04/01}{Patch \cs{@footnotetext} instead of % re-writing it}% % Redefine \cs{@footnotetext} by patching the calls \cs{fnb@fnstart} % and \cs{fnb@fnend} after all other packages have been % loaded.\footnote{Thanks to Bastien Roucaries for that patch} % \begin{macrocode} \AtBeginDocument{% \newcommand\fnb@orig@footnotetext{}% \let\fnb@orig@footnotetext\@footnotetext \long\def\@footnotetext#1{\fnb@orig@footnotetext{\fnb@fnstart#1\fnb@fnend}}% % \end{macrocode} % \changes{1.10}{2004/04/06}{Write a warning at the end of the log % file}% % Append \cs{fnb@globalwarning} to \cs{@dofilelist} in order to print % the global warning \cs{fnb@globalwarning} after all other messages, % e.g., the \cs{listfiles} list. % \begin{macrocode} \newcommand\fnb@dofilelist{}% \let\fnb@dofilelist\@dofilelist \def\@dofilelist{\fnb@dofilelist\fnb@globalwarning}% } % \end{macrocode} % Initialise \cs{fnb@globalwarning} to print no warning by default. % \begin{macrocode} \newcommand\fnb@globalwarning{}% \let\fnb@globalwarning\relax % % \end{macrocode} % % \Finale