\iffalse; awk '/S[H]ELL/' lineno.sty|sh;exit;\fi %%% To pretty-print this file, feed it to a unix shell! %%% %%% $Id: lineno.sty,v 3.11 2002/01/26 23:40:55 stephan Exp $ %%% %%% Copyright 1995--2001 Stephan I. B"ottcher %%% %%% 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. %%% % \documentclass[a4paper,12pt]{article}%D % \usepackage{lineno}%D % % \title{ % \texttt{\itshape % lineno.sty \ v3.08b 2002/02/27 % }\\\ \\ % A \LaTeX\ package to attach % \\ Line numbers to paragraphs % }\author{ % Stephan I. B\"ottcher % }\date{ % stephan@nevis.columbia.edu %% \\ Stephan.Boettcher@desy.de %% \\ Stephan.Boettcher@cern.ch % \\} % % % \def~{\verb~} % \catcode`\<\catcode`\~ % \def<#1>{$\langle${\itshape#1}\/$\rangle$} % \catcode`\|\catcode`\~ % \def|#1{{\ttfamily\string#1}} % \newenvironment{code} % {\par\runninglinenumbers % \modulolinenumbers[1] % \linenumbersep.3em % \footnotesize % \def\linenumberfont % {\normalfont\tiny\itshape}} % {} % % \begin{document}%D %% \DocInput{lineno.doc}%D % \pagewiselinenumbers % \maketitle % \tableofcontents % \sloppy % % % % \section{ % Introduction % } % This package provides line numbers on paragraphs. % After \TeX\ has broken a paragraph into lines there will % be line numbers attached to them, with the possibility to % make references through the \LaTeX\ ~\ref~, ~\pageref~ % cross reference mechanism. This includes four issues: % \begin{itemize} % \item attach a line number on each line, % \item create references to a line number, % \item control line numbering mode, % \item count the lines and print the numbers. % \end{itemize} % The first two points are implemented through patches to % the output routine. The third by redefining ~\par~, ~\@par~ % and ~\@@par~. The counting is easy, as long as you want % the line numbers run through the text. If they shall % start over at the top of each page, the aux-file as well % as \TeX s memory have to carry a load for each counted line. % % I wrote this package for my wife Petra, who needs it for % transcriptions of interviews. This allows her to % precisely refer to passages in the text. It works well % together with ~\marginpar~s, but not to well with displaymath. % ~\footnote~s are a problem, especially when they % are split, but we may get there. % % lineno.sty works % surprisingly well with other packages, for % example, ~wrapfig.sty~. So please try if it % works with whatever you need, and if it does, % please tell me, and if it does not, tell me as % well, so I can try to fix it. % % This style option is written for \LaTeXe, later than November 1994, % since we need the ~\protected@write~ macro. \NeedsTeXFormat{LaTeX2e}[1994/11/04] \ProvidesPackage{lineno} [2002/01/27 line numbers on paragraphs v3.08b] %% v1.00 1995/03/31 SIB: first release for Petras interview transcriptions %% v1.01 1995/10/28 SIB: added ~pagewise~ mode %% v1.02 1995/11/15 SIB: added ~modulo~ option %% v1.03 1995/12/05 SIB: pagewise: try to reduce the hash-size requirements %% v2.00 1995/12/06 SIB: .. it works, new user interface %% v2.01 1996/09/17 SIB: put into CVS %% v2.02 1997/03/17 SIB: add: \@reinserts, for footnotes %% v2.04 1998/03/09 SIB: add: linenomath environment %% v2.05 1998/04/26 SIB: add: prevgraf test %% v2.06 1999/03/02 SIB: LPPL added %% v3.00 1999/06/11 SiB: include the extension in the main file %% v3.01 1999/08/28 SiB: \@reinserts -> \holdinginserts %% v3.02 2000/03/10 SiB: \@LN@output %% v3.03 2000/07/01 SiB: \@LN@ExtraLabelItems, hyperref %% v3.04 2000/12/17 SiB: longtable compatibility. %% v3.05 2001/01/02 SiB: [fleqn] detection. %% v3.05a 2001/01/04 SiB: [fleqn] detection reverted for eqnarray. %% v3.06 2001/01/17 SiB: [twocolumn] mode support. %% v3.07 2001/07/30 SiB: [hyperref] option obsoleted. %% v3.08 2001/08/02 SiB: linenomath wrapping for \[ \] %% v3.08a 2001/08/04 SiB: linenomath wrapping for \[ \] fixed %% v3.08b 2002/01/27 SiB: enquotation typo fix %% %% Acknowledgements: %% v3.06: Donald Arseneau, pointed to mparhack.sty. %% v3.07+: Frank Mittelbach, points out inconsistencies in the %% user interface. % % \section{ % Put the line numbers to the lines % } % The line numbers have to be attached by the output % routine. We simply set the ~\interlinepenalty~ to -100000. % The output routine will be called after each line in the % paragraph, except the last, where we trigger by ~\par~. % The ~\linenopenalty~ is small enough to compensate a bunch of % penalties (e.g., with ~\samepage~). % % (New v3.04) Longtable uses % ~\penaly~-30000. The lineno penalty range was % shrunk to $-188000 \dots -32000$. (/New v3.04) \newcount\linenopenalty\linenopenalty=-100000 \mathchardef\linenopenaltypar=32000 % So let's make a hook to ~\output~, the direct way. The \LaTeX\ % macro ~\@reinserts~ puts the footnotes back on the page. % % (New v3.01) ~\@reinserts~ badly % screws up split footnotes. The bottom part is % still on the recent contributions list, and the % top part will be put back there after the bottom % part. Thus, since lineno.sty does not play well % with ~\inserts~ anyway, we can safely experiment % with ~\holdinginserts~, without making things % much worse. % % Or that's what I thought, but: Just activating % ~\holdinginserts~ while doing the ~\par~ will % not do the trick: The ~\output~ routine may be % called for a real page break before all line % numbers are done, and how can we get control % over ~\holdinginserts~ at that point? % % Let's try this: When the ~\output~ routine is % run with ~\holdinginserts=3~ for a real page % break, then we reset ~\holdinginserts~ and % restart ~\output~. % % Then, again, how do we keep the remaining % ~\inserts~ while doing further line numbers? % % If we find ~\holdinginserts~=-3 we activate it again % after doing ~\output~. (/New v3.01) % % (New v3.02) To work with % multicol.sty, the original output routine is now % called indirectly, instead of being replaced. % When multicol.sty changes ~\output~, it is a % toks register, not the real thing. (/New v3.02) \let\@LN@output\output \newtoks\output \output=\expandafter{\the\@LN@output} \@LN@output={% \LineNoTest \if@tempswa \LineNoHoldInsertsTest \if@tempswa \if@twocolumn\let\@makecol\@LN@makecol\fi \the\output \ifnum\holdinginserts=-3 \global\holdinginserts 3 \fi \else \global\holdinginserts-3 \unvbox\@cclv \ifnum\outputpenalty=10000\else \penalty\outputpenalty \fi \fi \else \MakeLineNo \fi } % The float mechanism inserts ~\interlinepenalty~s during % ~\output~. So carefully reset it before going on. Else % we get doubled line numbers on every float placed in % horizontal mode, e.g, from ~\linelabel~. % % Sorry, neither a ~\linelabel~ nor a ~\marginpar~ should % insert a penalty, else the following linenumber % could go to the next page. Nor should any other % float. So let us suppress the ~\interlinepenalty~ % altogether with the ~\@nobreak~ switch. % % Since (ltspace.dtx, v1.2p)[1996/07/26], the ~\@nobreaktrue~ does % it's job globally. We need to do it locally here. \def\LineNoTest{% \let\@@par\@@@par \ifnum\interlinepenalty<-\linenopenaltypar \advance\interlinepenalty-\linenopenalty \my@nobreaktrue \fi \@tempswatrue \ifnum\outputpenalty>-\linenopenaltypar\else \ifnum\outputpenalty>-188000\relax \@tempswafalse \fi \fi } \def\my@nobreaktrue{\let\if@nobreak\iftrue} \def\LineNoHoldInsertsTest{% \ifnum\holdinginserts=3\relax \@tempswafalse \fi } % We have to return all the page to the current page, and % add a box with the line number, without adding % breakpoints, glue or space. The depth of our line number % should be equal to the previous depth of the page, in % case the page breaks here, and the box has to be moved up % by that depth. % % The ~\interlinepenalty~ comes after the ~\vadjust~ from a % ~\linelabel~, so we increment the line number \emph{after} % printing it. The macro ~\makeLineNumber~ produces the % text of the line number, see section \ref{appearance}. % % Finally we put in the natural ~\interlinepenalty~, except % after the last line. \def\MakeLineNo{\@tempdima\dp\@cclv \unvbox\@cclv \sbox\@tempboxa{\hbox to\z@{\makeLineNumber}}% \stepcounter{linenumber}% \dp\@tempboxa=\@tempdima\ht\@tempboxa=\z@ \nointerlineskip\kern-\@tempdima\box\@tempboxa \ifnum\outputpenalty=-\linenopenaltypar\else \@tempcnta\outputpenalty \advance\@tempcnta -\linenopenalty \penalty\@tempcnta \fi } % % % \section{ % Control line numbering % } % The line numbering is controlled via ~\par~. \LaTeX\ % saved the \TeX-primitive ~\par~ in ~\@@par~. We push it % one level further out, and redefine ~\@@par~ to insert % the ~\interlinepenalty~ needed to trigger the % line numbering. And we need to allow pagebreaks after a % paragraph. % % New (2.05beta): the prevgraf test. A paragraph that ends with a % displayed equation, a ~\noindent\par~ or ~wrapfig.sty~ produce empty % paragraphs. These should not get a spurious line number via % ~\linenopenaltypar~. \let\@@@par\@@par \newcount\linenoprevgraf \def\linenumberpar{\ifvmode\@@@par\else\ifinner\@@@par\else \advance\interlinepenalty \linenopenalty \linenoprevgraf\prevgraf \global\holdinginserts3% \@@@par \ifnum\prevgraf>\linenoprevgraf \penalty-\linenopenaltypar \fi \kern\z@ \global\holdinginserts0% \advance\interlinepenalty -\linenopenalty \fi\fi } % The basic commands to enable and disable line numbers. % ~\@par~ and ~\par~ are only touched, when they are ~\let~ % to ~\@@@par~/~\linenumberpar~. The line number may be % reset to 1 with the star-form, or set by an optional % argument ~[~~]~. \def\linenumbers{\let\@@par\linenumberpar \ifx\@par\@@@par\let\@par\linenumberpar\fi \ifx\par\@@@par\let\par\linenumberpar\fi \@ifnextchar[{\resetlinenumber}%] {\@ifstar{\resetlinenumber}{}}% } \def\nolinenumbers{\let\@@par\@@@par \ifx\@par\linenumberpar\let\@par\@@@par\fi \ifx\par\linenumberpar\let\par\@@@par\fi } % What happens with a display math? Since ~\par~ is not executed, % when breaking the lines before a display, they will not get % line numbers. Sorry, but I do not dare to change % ~\interlinepenalty~ globally, nor do I want to redefine % the display math environments here. % \begin{displaymath} % display \ math % \end{displaymath} % See the subsection below, for a wrapper enviroment to make % it work. But that requires to wrap each and every display % in your LaTeX source. % % The next two commands are provided to turn on line % numbering in a specific mode. Please note the difference: % for pagewise numbering, ~\linenumbers~ comes first to % inhibit it from seeing optional arguments, since % re-/presetting the counter is useless. \def\pagewiselinenumbers{\linenumbers\setpagewiselinenumbers} \def\runninglinenumbers{\setrunninglinenumbers\linenumbers} % Finally, it is a \LaTeX\ style, so we provide for the use % of environments, including the suppression of the % following paragraph's indentation. %%% TO DO: add \par to \linenumbers, if called from an environment. %%% To DO: add an \@endpe hack if \linenumbers are turned on %%% in horizontal mode. {\par\parskip\z@\noindent} or %%% something. \@namedef{linenumbers*}{\par\linenumbers*} \@namedef{runninglinenumbers*}{\par\runninglinenumbers*} \def\endlinenumbers{\par\@endpetrue} \let\endrunninglinenumbers\endlinenumbers \let\endpagewiselinenumbers\endlinenumbers \expandafter\let\csname endlinenumbers*\endcsname\endlinenumbers \expandafter\let\csname endrunninglinenumbers*\endcsname\endlinenumbers \let\endnolinenumbers\endlinenumbers % % \subsection{ % Display math % } % % Now we tackle the problem to get display math working. % There are different options. % \begin{enumerate}\item[ % 1.] Precede every display math with a ~\par~. % Not too good. % \item[ % 2.] Change ~\interlinepenalty~ and associates globally. % Unstable. % \item[ % 3.] Wrap each display math with a ~{linenomath}~ % environment. % \end{enumerate} % We'll go for option 3. See if it works: % \begin{linenomath} % \begin{equation} % display \ math % \end{equation} % \end{linenomath} % The star form ~{linenomath*}~ should also number the lines % of the display itself, % \begin{linenomath*} % \begin{eqnarray} % multi && line \\ % display && math \\ % & % \begin{array}{c} % with \\ % array % \end{array} % & % \end{eqnarray} % \end{linenomath*} % including multline displays. % % First, here are two macros to turn % on linenumbering on paragraphs preceeding displays, with % numbering the lines of the display itself, or without. % The ~\ifx..~ tests if line numbering is turned on. It % does not harm to add these wrappers in sections that are % not numbered. Nor does it harm to wrap a display % twice, e.q, in case you have some ~{equation}~s wrapped % explicitely, and later you redefine ~\equation~ to do it % automatically. \newcommand\linenomathNonumbers{% \ifx\@@par\@@@par\else \ifnum\interlinepenalty>-\linenopenaltypar \global\holdinginserts3% \advance\interlinepenalty \linenopenalty \advance\predisplaypenalty \linenopenalty \fi \fi \ignorespaces } \newcommand\linenomathWithnumbers{% \ifx\@@par\@@@par\else \ifnum\interlinepenalty>-\linenopenaltypar \global\holdinginserts3% \advance\interlinepenalty \linenopenalty \advance\predisplaypenalty \linenopenalty \advance\postdisplaypenalty \linenopenalty \advance\interdisplaylinepenalty \linenopenalty \fi \fi \ignorespaces } % The ~{linenomath}~ environment has two forms, with and % without a star. The following two macros define the % environment, where the stared/non-stared form does/doesn't number the % lines of the display or vice versa. \newcommand\linenumberdisplaymath{% \def\linenomath{\linenomathWithnumbers}% \@namedef{linenomath*}{\linenomathNonumbers}% } \newcommand\nolinenumberdisplaymath{% \def\linenomath{\linenomathNonumbers}% \@namedef{linenomath*}{\linenomathWithnumbers}% } \def\endlinenomath{% \global\holdinginserts0 \@ignoretrue } \expandafter\let\csname endlinenomath*\endcsname\endlinenomath % The default is not to number the lines of a display. But % the package option ~mathlines~ may be used to switch % that behavior. \nolinenumberdisplaymath % % % \section{ % Line number references % } % The only way to get a label to a line number in a % paragraph is to ask the output routine to mark it. % % We use the marginpar mechanism to hook to ~\output~ for a % second time. Marginpars are floats with number $-1$, we % fake marginpars with No $-2$. Originally, every negative % numbered float was considered to be a marginpar. % % The float box number ~\@currbox~ is used to transfer the % label name in a macro called ~\@LNL@~. % % A ~\newlabel~ is written to the aux-file. The reference % is to ~\theLineNumber~, \emph{not} ~\thelinenumber~. % This allows to hook in, as done below for pagewise line % numbering. % % (New v3.03) The ~\@LN@ExtraLabelItems~ are added for a hook % to keep packages like ~{hyperref}~ happy. (/New v3.03) \let\@LN@addmarginpar\@addmarginpar \def\@addmarginpar{% \ifnum\count\@currbox>-2\relax \expandafter\@LN@addmarginpar \else \@cons\@freelist\@currbox \protected@write\@auxout{}{% \string\newlabel {\csname @LNL@\the\@currbox\endcsname}% {{\theLineNumber}{\thepage}\@LN@ExtraLabelItems}}% \fi} \let\@LN@ExtraLabelItems\@empty % \subsection{ % The linelabel command % } % To refer to a place in line ~\ref{~~}~ at page % ~\pageref{~~}~ you place a ~\linelabel{~~}~ at % that place. % % \linelabel{demo} % \marginpar{\tiny\raggedright % See if it works: This paragraph % starts on page \pageref{demo}, line % \ref{demo}. % }% % If you use this command outside a ~\linenumbers~ % paragraph, you will get references to some bogus % line numbers, sorry. But we don't disable the command, % because only the ~\par~ at the end of a paragraph may % decides whether to print line numbers on this paragraph % or not. A ~\linelabel~ may legally appear earlier than % ~\linenumbers~. % % ~\linelabel~, via a fake float number $-2$, puts a % ~\penalty~ into a ~\vadjust~, which triggers the % pagebuilder after putting the current line to the main % vertical list. A ~\write~ is placed on the main vertical % list, which prints a reference to the current value of % ~\thelinenumber~ and ~\thepage~ at the time of the % ~\shipout~. % % A ~\linelabel~ is allowed only in outer horizontal mode. % In outer vertical mode we start a paragraph, and ignore % trailing spaces (by fooling ~\@esphack~). % % The argument of ~\linelabel~ is put into a macro with a % name derived from the number of the allocated float box. % Much of the rest is dummy float setup. \def\linelabel#1{% \ifvmode \ifinner \else \leavevmode \@bsphack \@savsk\p@ \fi \else \@bsphack \fi \ifhmode \ifinner \@parmoderr \else \@floatpenalty -\@Mii \@next\@currbox\@freelist {\global\count\@currbox-2% \expandafter\gdef\csname @LNL@\the\@currbox\endcsname{#1}}% {\@floatpenalty\z@ \@fltovf \def\@currbox{\@tempboxa}}% \begingroup \setbox\@currbox \color@vbox \vbox \bgroup \end@float \endgroup \@ignorefalse \@esphack \fi \else \@parmoderr \fi } % \modulolinenumbers[3] % \section{ % The appearance of the line numbers % }\label{appearance} % The line numbers are set as ~\tiny\sffamily\arabic{linenumber}~, % $10pt$ left of the text. With options to place it % right of the text, or . . . % % . . . here are the hooks: \def\makeLineNumberLeft{\hss\linenumberfont\LineNumber\hskip\linenumbersep} \def\makeLineNumberRight{\linenumberfont\hskip\linenumbersep\hskip\columnwidth \hbox to\linenumberwidth{\hss\LineNumber}\hss} \def\linenumberfont{\normalfont\tiny\sffamily} \newdimen\linenumbersep \newdimen\linenumberwidth \linenumberwidth=10pt \linenumbersep=10pt % Margin switching requires ~pagewise~ numbering mode, but % choosing the left or right margin for the numbers always % works. \def\switchlinenumbers{\@ifstar {\let\makeLineNumberOdd\makeLineNumberRight \let\makeLineNumberEven\makeLineNumberLeft}% {\let\makeLineNumberOdd\makeLineNumberLeft \let\makeLineNumberEven\makeLineNumberRight}% } \def\setmakelinenumbers#1{\@ifstar {\let\makeLineNumberRunning#1% \let\makeLineNumberOdd#1% \let\makeLineNumberEven#1}% {\ifx\c@linenumber\c@runninglinenumber \let\makeLineNumberRunning#1% \else \let\makeLineNumberOdd#1% \let\makeLineNumberEven#1% \fi}% } \def\leftlinenumbers{\setmakelinenumbers\makeLineNumberLeft} \def\rightlinenumbers{\setmakelinenumbers\makeLineNumberRight} \leftlinenumbers* % ~\LineNumber~ is a hook which is used for the modulo stuff. % It is the command to use for the line number, when you % customizes ~\makeLineNumber~. Use ~\thelinenumber~ to % change the outfit of the digits. % % % We will implement two modes of operation: % \begin{itemize} % \item numbers ~running~ through (parts of) the text % \item ~pagewise~ numbers starting over with one on top of % each page. % \end{itemize} % Both modes have their own count register, but only one is % allocated as a \LaTeX\ counter, with the attached % facilities serving both. \newcounter{linenumber} \newcount\c@pagewiselinenumber \let\c@runninglinenumber\c@linenumber % Only the running mode counter may be reset, or preset, % for individual paragraphs. The pagewise counter must % give a unique anonymous number for each line. \newcommand\resetlinenumber[1][1]{\c@runninglinenumber#1} % \subsection{ % Running line numbers % } % Running mode is easy, ~\LineNumber~ and ~\theLineNumber~ % produce ~\thelinenumber~, which defaults to % ~\arabic{linenumber}~, using the ~\c@runninglinenumber~ % counter. This is the default mode of operation. \def\makeRunningLineNumber{\makeLineNumberRunning} \def\setrunninglinenumbers{% \def\theLineNumber{\thelinenumber}% \let\c@linenumber\c@runninglinenumber \let\makeLineNumber\makeRunningLineNumber } \setrunninglinenumbers\resetlinenumber % % % \subsection{ % Pagewise line numbers % } % Difficult, if you think about it. The number has to be % printed when there is no means to know on which page it % will end up, except through the aux-file. My solution % is really expensive, but quite robust. % % With version ~v2.00~ the hashsize requirements are % reduced, because we do not need one controlsequence for % each line any more. But this costs some computation time % to find out on which page we are. % % ~\makeLineNumber~ gets a hook to log the line and page % number to the aux-file. Another hook tries to find out % what the page offset is, and subtracts it from the counter % ~\c@linenumber~. Additionally, the switch % ~\ifoddNumberedPage~ is set true for odd numbered pages, % false otherwise. \def\setpagewiselinenumbers{% \let\theLineNumber\thePagewiseLineNumber \let\c@linenumber\c@pagewiselinenumber \let\makeLineNumber\makePagewiseLineNumber } \def\makePagewiseLineNumber{\logtheLineNumber\getLineNumber \ifoddNumberedPage \makeLineNumberOdd \else \makeLineNumberEven \fi } % Each numbered line gives a line to the aux file % \begin{verse} % ~\@LN{~~}{~~}~ % \end{verse} % very similar to the ~\newlabel~ business, except that we need % an arabic representation of the page number, not what % there might else be in ~\thepage~. \def\logtheLineNumber{\protected@write\@auxout{}{% \string\@LN{\the\c@linenumber}{\noexpand\the\c@page}}} % From the aux-file we get one macro ~\LN@P~ for each % page with line numbers on it. This macro calls four other % macros with one argument each. These macros are % dynamically defined to do tests and actions, to find out % on which page the current line number is located. % % We need sort of a pointer to the first page with line % numbers, initiallized to point to nothing: \def\LastNumberedPage{first} \def\LN@Pfirst{\nextLN\relax} % The four dynamic macros are initiallized to reproduce % themselves in an ~\xdef~ \let\lastLN\relax % compare to last line on this page \let\firstLN\relax % compare to first line on this page \let\pageLN\relax % get the page number, compute the linenumber \let\nextLN\relax % move to the next page % During the end-document run through the aux-files, we % disable ~\@LN~. I may put in a check here later, to give % a rerun recommendation. \AtEndDocument{\let\@LN\@gobbletwo} % Now, this is the tricky part. First of all, the whole % definition of ~\@LN~ is grouped, to avoid accumulation % on the save stack. Somehow ~\csname~~\endcsname~ pushes % an entry, which stays after an ~\xdef~ to that . % % If ~\LN@P~ is undefined, initialize it with the % current page and line number, with the % \emph{pointer-to-the-next-page} pointing to nothing. And % the macro for the previous page will be redefined to point % to the current one. % % If the macro for the current page already exists, just % redefine the \emph{last-line-number} entry. % % Finally, save the current page number, to get the pointer to the % following page later. \def\@LN#1#2{{\expandafter\@@LN \csname LN@P#2C\@LN@column\expandafter\endcsname \csname LN@PO#2\endcsname {#1}{#2}}} \def\@@LN#1#2#3#4{\ifx#1\relax \ifx#2\relax\gdef#2{#3}\fi \expandafter\@@@LN\csname LN@P\LastNumberedPage\endcsname#1 \xdef#1{\lastLN{#3}\firstLN{#3}\pageLN{#4}{\@LN@column}{#2}\nextLN\relax}% \else \def\lastLN##1{\noexpand\lastLN{#3}}% \xdef#1{#1}% \fi \xdef\LastNumberedPage{#4C\@LN@column}} % The previous page macro gets its pointer to the % current one, replacing the ~\relax~ with the cs-token % ~\LN@P~. \def\@@@LN#1#2{{\def\nextLN##1{\noexpand\nextLN\noexpand#2}% \xdef#1{#1}}} % Now, to print a line number, we need to find the page, % where it resides. This will most probably be the page where % the last one came from, or maybe the next page. However, it can % be a completely different one. We maintain a cache, % which is ~\let~ to the last page's macro. But for now % it is initialized to expand ~\LN@first~, where the poiner % to the first numbered page has been stored in. \def\NumberedPageCache{\LN@Pfirst} % To find out on which page the current ~\c@linenumber~ is, % we define the four dynamic macros to do something usefull % and execute the current cache macro. ~\lastLN~ is run % first, testing if the line number in question may be on a % later page. If so, disable ~\firstLN~, and go on to the % next page via ~\nextLN~. \def\testLastNumberedPage#1{\ifnum#1<\c@linenumber \let\firstLN\@gobble \fi} % Else, if ~\firstLN~ finds out that we need an earlier % page, we start over from the beginning. Else, ~\nextLN~ % will be disabled, and ~\pageLN~ will run % ~\gotNumberedPage~ with four arguments: the first line % number on this column, the page number, the column % number, and the first line on the page. \def\testFirstNumberedPage#1{\ifnum#1>\c@linenumber \def\nextLN##1{\testNextNumberedPage\LN@Pfirst}% \else \let\nextLN\@gobble \def\pageLN{\gotNumberedPage{#1}}% \fi} % We start with ~\pageLN~ disabled and ~\nextLN~ defined to % continue the search with the next page. \long\def \@gobblethree #1#2#3{} \def\testNumberedPage{% \let\lastLN\testLastNumberedPage \let\firstLN\testFirstNumberedPage \let\pageLN\@gobblethree \let\nextLN\testNextNumberedPage \NumberedPageCache } % When we switch to another page, we first have to make % sure that it is there. If we are done with the last % page, we probably need to run \TeX\ again, but for the % rest of this run, the cache macro will just return four % zeros. This saves a lot of time, for example if you have % half of an aux-file from an aborted run, in the next run % the whole page-list would be searched in vain again and % again for the second half of the document. % % If there is another page, we iterate the search. \def\testNextNumberedPage#1{\ifx#1\relax \global\def\NumberedPageCache{\gotNumberedPage0000}% \PackageWarningNoLine{lineno}% {Linenumber reference failed, \MessageBreak rerun to get it right}% \else \global\let\NumberedPageCache#1% \fi \testNumberedPage } % \linelabel{demo2} % \marginpar{\tiny\raggedright % Let's see if it finds the label % on page \pageref{demo}, % line \ref{demo}, and back here % on page \pageref{demo2}, line % \ref{demo2}. % }% % To separate the official hooks from the internals there is % this equivalence, to hook in later for whatever purpose: \let\getLineNumber\testNumberedPage % So, now we got the page where the number is on. We % establish if we are on an odd or even page, and calculate % the final line number to be printed. \newif\ifoddNumberedPage \newif\ifcolumnwiselinenumbers \columnwiselinenumbersfalse \def\gotNumberedPage#1#2#3#4{\oddNumberedPagefalse \ifodd \if@twocolumn #3\else #2\fi\relax\oddNumberedPagetrue\fi \advance\c@linenumber 1\relax \ifcolumnwiselinenumbers \subtractlinenumberoffset{#1}% \else \subtractlinenumberoffset{#4}% \fi } % You might want to run the pagewise mode with running line % numbers, or you might not. It's your choice: \def\runningpagewiselinenumbers{% \let\subtractlinenumberoffset\@gobble } \def\realpagewiselinenumbers{% \def\subtractlinenumberoffset##1{\advance\c@linenumber-##1\relax}% } \realpagewiselinenumbers % For line number references, we need a protected call to % the whole procedure, with the requested line number stored % in the ~\c@linenumber~ counter. This is what gets printed % to the aux-file to make a label: \def\thePagewiseLineNumber{\protect \getpagewiselinenumber{\the\c@linenumber}}% % And here is what happens when the label is refered to: \def\getpagewiselinenumber#1{{% \c@linenumber #1\relax\testNumberedPage \thelinenumber }} % % % A summary of all per line expenses: % \begin{description}\item % [CPU:] The ~\output~ routine is called for each line, % and the page-search is done. % \item % [DISK:] One line of output to the aux-file for each % numbered line % \item % [MEM:] One macro per page. Great improvement over v1.02, % which had one control sequence per line in % addition. It blew the hash table after some five % thousand lines. % \end{description} % % % % \subsection{ % Twocolumn mode (New v3.06) % } % % Twocolumn mode requires another patch to the ~\output~ % routine, in order to print a column tag to the .aux % file. \let\@LN@orig@makecol\@makecol \def\@LN@makecol{% \@LN@orig@makecol \setbox\@outputbox \vbox{% \boxmaxdepth \@maxdepth \protected@write\@auxout{}{% \string\@LN@col{\if@firstcolumn1\else2\fi}% }% \box\@outputbox }% \vbox } \def\@LN@col#1{\def\@LN@column{#1}} \@LN@col{1} % % % % \subsection{ % Numbering modulo 5 % } % Most users want to have only one in five lines numbered. % ~\LineNumber~ is supposed to produce the outfit of the % line number attached to the line, while ~\thelinenumber~ % is used also for references, which should appear even if % they are not multiples of five. \newcount\c@linenumbermodulo \def\themodulolinenumber{{\@tempcnta\c@linenumber \divide\@tempcnta\c@linenumbermodulo \multiply\@tempcnta\c@linenumbermodulo \ifnum\@tempcnta=\c@linenumber\thelinenumber\fi }} % The user command to set the modulo counter: \newcommand\modulolinenumbers[1][0]{% \let\LineNumber\themodulolinenumber \ifnum#1>1\relax \c@linenumbermodulo#1\relax \else\ifnum#1=1\relax \def\LineNumber{\thelinenumber}% \fi\fi } \setcounter{linenumbermodulo}{5} \modulolinenumbers[1] % % \switchlinenumbers % \modulolinenumbers[1] % \section{ % Package options % } % There is a bunch of package options, all of them % executing only user commands (see below). % % Options ~left~ (~right~) put the line numbers on the left % (right) margin. This works in all modes. ~left~ is the % default. \DeclareOption{left}{\leftlinenumbers*} \DeclareOption{right}{\rightlinenumbers*} % Option ~switch~ (~switch*~) puts the line numbers on the % outer (inner) margin of the text. This requires running % the pagewise mode, but we turn off the page offset % subtraction, getting sort of running numbers again. The % ~pagewise~ option may restore true pagewise mode later. \DeclareOption{switch}{\setpagewiselinenumbers \switchlinenumbers \runningpagewiselinenumbers} \DeclareOption{switch*}{\setpagewiselinenumbers \switchlinenumbers*% \runningpagewiselinenumbers} % In twocolumn mode, we can switch the line numbers to % the outer margin, and/or start with number 1 in each % column. Margin switching is covered by the ~switch~ % options. \DeclareOption{columnwise}{\setpagewiselinenumbers \columnwiselinenumberstrue \realpagewiselinenumbers} % The options ~pagewise~ and ~running~ select the major % linenumber mechanism. ~running~ line numbers refer to a real % counter value, which can be reset for any paragraph, % even getting multiple paragraphs on one page starting % with line number one. ~pagewise~ line numbers get a % unique hidden number within the document, but with the % opportunity to establish the page on which they finally % come to rest. This allows the subtraction of the page % offset, getting the numbers starting with 1 on top of each % page, and margin switching in twoside formats becomes % possible. The default mode is ~running~. % % The order of declaration of the options is important here % ~pagewise~ must come after ~switch~, to overide running % pagewise mode. ~running~ comes last, to reset the running % line number mode, e.g, after selecting margin switch mode % for ~pagewise~ running. Once more, if you specify all % three of the options ~[switch,pagewise,running]~, the % result is almost nothing, but if you later say % ~\pagewiselinenumbers~, you get margin switching, with % real pagewise line numbers. % \DeclareOption{pagewise}{\setpagewiselinenumbers \realpagewiselinenumbers} \DeclareOption{running}{\setrunninglinenumbers} % The option ~modulo~ causes only those linenumbers to be % printed which are multiples of five. \DeclareOption{modulo}{\modulolinenumbers\relax} % The package option ~mathlines~ switches the behavior of % the ~{linenomath}~ environment with its star-form. % Without this option, the ~{linenomath}~ environment does % not number the lines of the display, while the star-form % does. With this option, its just the opposite. % %%% 1999-06-10: renamed ~displaymath~ to ~mathlines~. \DeclareOption{mathlines}{\linenumberdisplaymath} % ~displaymath~ now calls for wrappers of the standard % LaTeX display math environment. This was previously % done by ~mlineno.sty~. \let\do@mlineno\relax \DeclareOption{displaymath}{\let\do@mlineno\@empty} % The ~hyperref~ package, via ~nameref~, requires three more % groups in the second argment of a ~\newlabel~. Well, why % shouldn't it get them? (New v3.07) The presencs of the % ~nameref~ package is now detected automatically % ~\AtBeginDocument~. (/New v3.07) \DeclareOption{hyperref}{\PackageWarningNoLine{lineno}{% Option [hyperref] is obsolete. \MessageBreak The hyperref package is detected automatically.}} \AtBeginDocument{% \@ifpackageloaded{nameref}{% \def\@LN@ExtraLabelItems{{}{}{}}}} \ProcessOptions % \subsection{ % Package Extensions % } % % The extensions in this section were previously supplied % in seperate ~.sty~ files. % % \subsubsection{ % $display math$ % } % % The standard \LaTeX\ display math environments are % wrapped in a ~{linenomath}~ environment. % % (New 3.05) The ~[fleqn]~ option of the standard % \LaTeX\ classes defines the display math % environments such that line numbers appear just % fine. Thus, we need not do any tricks when % ~[fleqn]~ is loaded, as indicated by presents of % the ~\mathindent~ register. (/New 3.05) % % (New 3.05a) for ~{eqnarray}~s we rather keep the % old trick. (/New 3.05a) % % (New 3.08) Wrap ~\[~ and ~\]~ into ~{linenomath}~, % instead of ~{displaymath}~. Also save the definition % of ~\equation~, instead of replicating the current % \LaTeX\ definition. (/New 3.08) \ifx\do@mlineno\@empty \@ifundefined{mathindent}{ \let\LN@displaymath\[ \let\LN@enddisplaymath\] \renewcommand\[{\begin{linenomath}\LN@displaymath} \renewcommand\]{\LN@enddisplaymath\end{linenomath}} \let\LN@equation\equation \let\LN@endequation\endequation \renewenvironment{equation} {\linenomath\LN@equation} {\LN@endequation\endlinenomath} }% \@ifundefined{mathindent} \let\LN@eqnarray\eqnarray \let\LN@endeqnarray\endeqnarray \renewenvironment{eqnarray} {\linenomath\LN@eqnarray} {\LN@endeqnarray\endlinenomath} \fi % \subsubsection{ % Line numbers in internal vertical mode % } % % The command ~\internallinenumbers~ adds line numbers in % internal vertical mode, but with limitations: we assume % fixed baseline skip. \def\internallinenumbers{\setrunninglinenumbers \let\@@par\internallinenumberpar \ifx\@par\@@@par\let\@par\internallinenumberpar\fi \ifx\par\@@@par\let\par\internallinenumberpar\fi \ifx\@par\linenumberpar\let\@par\internallinenumberpar\fi \ifx\par\linenumberpar\let\par\internallinenumberpar\fi \@ifnextchar[{\resetlinenumber}%] {\@ifstar{\let\c@linenumber\c@internallinenumber \c@linenumber\@ne}{}}% } \let\endinternallinenumbers\endlinenumbers \@namedef{internallinenumbers*}{\internallinenumbers*} \expandafter\let\csname endinternallinenumbers*\endcsname\endlinenumbers \newcount\c@internallinenumber \newcount\c@internallinenumbers \def\internallinenumberpar{\ifvmode\@@@par\else\ifinner\@@@par\else\@@@par \begingroup \c@internallinenumbers\prevgraf \setbox\@tempboxa\hbox{\vbox{\makeinternalLinenumbers}}% \dp\@tempboxa\prevdepth \ht\@tempboxa\z@ \nobreak\vskip-\prevdepth \nointerlineskip\box\@tempboxa \endgroup \fi\fi } \def\makeinternalLinenumbers{\ifnum\c@internallinenumbers>0\relax \hbox to\z@{\makeLineNumber}\global\advance\c@linenumber\@ne \advance\c@internallinenumbers\m@ne \expandafter\makeinternalLinenumbers\fi } % \subsubsection{ % Line number references with offset % } % % This extension defines macros to refer to line % numbers with an offset, e.g., to refer to a line % which cannot be labeled directly (display math). % This was formerly knows as ~rlineno.sty~. % % To refer to a pagewise line number with offset: % \begin{quote} % ~\linerefp[~~]{~