Diff of /lineno.sty [000000] .. [d6f438] Maximize Restore

  Switch to side-by-side view

--- a
+++ b/lineno.sty
@@ -0,0 +1,1517 @@
+\iffalse;                               awk '/S[H]ELL/' lineno.sty|sh;exit;\fi
+%%%                        To pretty-print this file, feed it to a unix shell!
+%%%
+%%% $Id: lineno.sty 2 2004-08-10 08:16:08Z egonw $
+%%%
+%%% Copyright 1995--2001 Stephan I. B"ottcher <stephan@nevis.columbia.edu>
+%%%
+%%% 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 ~[~<number>~]~. 
+
+\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@~<box-number>.
+%
+% 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{~<foo>~}~ at page
+% ~\pageref{~<foo>~}~ you place a ~\linelabel{~<foo>~}~ 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{~<line>~}{~<page>~}~
+%                                                                  \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~<page> 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~<cs>~\endcsname~ pushes
+% an entry, which stays after an ~\xdef~ to that <cs>.
+%
+% If ~\LN@P~<page> 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~<page>.  
+
+\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[~<OFFSET>~]{~<LABEL>~}~
+%                                                                  \end{quote}
+% To refer to a running line number with offset:
+%                                                                \begin{quote}
+%   ~\linerefr[~<OFFSET>~]{~<LABEL>~}~
+%                                                                  \end{quote}
+% To refer to a line number labeled in the same mode as currently
+% selected:
+%                                                                \begin{quote}
+%   ~\lineref[~<OFFSET>~]{~<LABEL>~}~
+%                                                                  \end{quote}
+
+\newcommand\lineref{%
+  \ifx\c@linenumner\c@runninglinenumner
+     \expandafter\linerefr
+  \else
+     \expandafter\linerefp
+  \fi
+}
+
+\newcommand\linerefp[2][\z@]{{%
+   \let\@thelinenumber\thelinenumber
+   \edef\thelinenumber{\advance\c@linenumber#1\relax\noexpand\@thelinenumber}%
+   \ref{#2}%
+}}
+
+% This goes deep into \LaTeX s internals.
+
+\newcommand\linerefr[2][\z@]{{%
+   \def\@@linerefadd{\advance\c@linenumber#1}%
+   \expandafter\@setref\csname r@#2\endcsname
+   \@linerefadd{#2}%
+}}
+
+\newcommand\@linerefadd[2]{\c@linenumber=#1\@@linerefadd\relax
+                           \thelinenumber}
+
+%                                                              \subsubsection{
+%      Numbered quotation environments
+%                                                                            }
+%
+% The ~{numquote}~ and ~{numquotation}~
+% environments are like ~{quote}~ and
+% ~{quotation}~, except there will be line
+% numbers.  
+% 
+% An optional argument gives the number to count
+% from.  A star ~*~ (inside or outside the closing
+% ~}~) prevent the reset of the line numbers.
+% Default is to count from one.
+
+\newcommand\quotelinenumbers
+   {\@ifstar\linenumbers{\@ifnextchar[\linenumbers{\linenumbers*}}}
+
+\newdimen\quotelinenumbersep
+\quotelinenumbersep=\linenumbersep
+\let\quotelinenumberfont\linenumberfont
+
+\newcommand\numquotelist
+   {\leftlinenumbers
+    \linenumbersep\quotelinenumbersep
+    \let\linenumberfont\quotelinenumberfont
+    \addtolength{\linenumbersep}{-\@totalleftmargin}%
+    \quotelinenumbers
+   }
+
+\newenvironment{numquote}     {\quote\numquotelist}{\endquote}
+\newenvironment{numquotation} {\quotation\numquotelist}{\endquotation}
+\newenvironment{numquote*}    {\quote\numquotelist*}{\endquote}
+\newenvironment{numquotation*}{\quotation\numquotelist*}{\endquotation}
+
+%                                                              \subsubsection{
+%      Frame around a paragraph
+%                                                                            }
+%
+% The ~{bframe}~ environment draws a frame around
+% some text, across page breaks, if necessary.
+%
+% This works only for plain text paragraphs,
+% without special height lines. All lines must be
+% ~\baselineskip~ apart, no display math.
+
+\newenvironment{bframe}
+  {\par
+   \@tempdima\textwidth
+   \advance\@tempdima 2\bframesep
+   \setbox\bframebox\hbox to\textwidth{%
+      \hskip-\bframesep
+      \vrule\@width\bframerule\@height\baselineskip\@depth\bframesep
+      \advance\@tempdima-2\bframerule
+      \hskip\@tempdima
+      \vrule\@width\bframerule\@height\baselineskip\@depth\bframesep
+      \hskip-\bframesep
+   }%
+   \hbox{\hskip-\bframesep
+         \vrule\@width\@tempdima\@height\bframerule\@depth\z@}%
+   \nointerlineskip
+   \copy\bframebox
+   \nobreak
+   \kern-\baselineskip
+   \runninglinenumbers
+   \def\makeLineNumber{\copy\bframebox\hss}%
+  }
+  {\par
+   \kern-\prevdepth
+   \kern\bframesep
+   \nointerlineskip
+   \@tempdima\textwidth
+   \advance\@tempdima 2\bframesep
+   \hbox{\hskip-\bframesep
+         \vrule\@width\@tempdima\@height\bframerule\@depth\z@}%
+  }
+
+\newdimen\bframerule
+\bframerule=\fboxrule
+
+\newdimen\bframesep
+\bframesep=\fboxsep
+
+\newbox\bframebox
+
+%                                                                    \section{
+%                   The final touch
+%                                                                            }
+% There is one deadcycle for each line number.
+
+\advance\maxdeadcycles 100
+
+\endinput
+
+%                                                                    \section{
+%              The user commands
+%                                                                            }
+% The user command to turn on and off line numbering 
+% are 
+%                                                     \begin{description}\item
+% [|\linenumbers]                                                       \ \par
+%     Turn on line numbering in the current mode.
+%                                                                        \item
+% [|\linenumbers*]                                              \ \par$\qquad$
+%        and reset the line number to 1.
+%                                                      \def\NL{<number>]}\item
+% [|\linenumbers[\NL]                                           \ \par$\qquad$
+%        and start with <number>.  
+%                                                                        \item
+% [|\nolinenumbers]                                                     \ \par
+%     Turn off line numbering.
+%                                                                        \item
+% [|\runninglinenumbers*[\NL]                                           \ \par
+%     Turn on ~running~ line numbers, with the same optional
+%     arguments as ~\linenumbers~.  The numbers are running
+%     through the text over pagebreaks.  When you turn
+%     numbering off and on again, the numbers will continue,
+%     except, of cause, if you ask to reset or preset the
+%     counter.
+%                                                                        \item
+% [|\pagewiselinenumbers]                                               \ \par
+%     Turn on ~pagewise~ line numbers.  The lines on each
+%     page are numbered beginning with one at the first
+%     ~pagewise~ numbered line.
+%                                                                        \item
+% [|\resetlinenumber[\NL]                                               \ \par
+%     Reset ~[~Set~]~ the line number to 1
+%     ~[~<number>~]~.
+%                                                                        \item
+% [|\setrunninglinenumbers]                                             \ \par
+%     Switch to ~running~ line number mode. Do \emph{not}
+%     turn it on or off.
+%                                                                        \item
+% [|\setpagewiselinenumbers]                                            \ \par
+%     Switch to ~pagewise~ line number mode. Do \emph{not}
+%     turn it on or off.
+%                                                                        \item
+% [|\switchlinenumbers*]                                                \ \par
+%     Causes margin switching in pagewise modes. With the
+%     star,  put the line numbers on the inner margin.
+%                                                                        \item
+% [|\leftlinenumbers*]                                                  \ \par
+%                                                                        \item
+% [|\rightlinenumbers*]                                                 \ \par
+%     Set the line numbers in the left/right margin. With the
+%     star this works for both modes of operation, without
+%     the star only for the currently selected mode. 
+%                                                                        \item
+% [|\runningpagewiselinenumbers]                                        \ \par
+%     When using the pagewise line number mode,  do not
+%     subtract the page offset.  This results in running
+%     line numbers again,  but with the possibility to switch
+%     margins.  Be careful when doing line number
+%     referencing,  this mode status must be the same while
+%     setting the paragraph and during references.
+%                                                                        \item
+% [|\realpagewiselinenumbers]                                           \ \par
+%     Reverses the effect of ~\runningpagewiselinenumbers~.
+%                                                                        \item
+% [|\modulolinenumbers[\NL]                                             \ \par
+%     Give a number only to lines which are multiples of
+%     ~[~<number>~]~.  If <number> is not specified, the
+%     current value in the counter ~linenumbermodulo~ is
+%     retained.  <number>=1 turns this off without changing
+%     ~linenumbermodulo~.  The counter is initialized to 5.
+%                                                                        \item
+% [|\linenumberdisplaymath]                                             \ \par
+%     Number the lines of a display math in a ~{linenomath}~
+%     environment, but do not in a ~{linenomath*}~
+%     environment.  This is used by the package option
+%     ~[mathlines]~. 
+%                                                                        \item
+% [|\nolinenumberdisplaymath]                                           \ \par
+%     Do not Number the lines of a display math in a
+%     ~{linenomath}~ environment, but do in a
+%     ~{linenomath*}~ environment.  This is the default.
+%                                                                        \item
+% [|\linelabel]                                                         \ \par
+%     Set a ~\linelabel{~<foo>~}~ to the line number where
+%     this commands is in.  Refer to it with the \LaTeX\
+%     referencing commands ~\ref{~<foo>~}~ and
+%     ~\pageref{~<foo>~}~.
+%                                                            \end{description}
+% The commands can be used globally, locally within groups
+% or as environments.  It is important to know that they 
+% take action only when the ~\par~ is executed.  The
+% ~\end{~<mode>~linenumbers}~ commands provide a ~\par~.
+% Examples:
+%                                                                \begin{verse}
+%   ~{\linenumbers~  <text> ~\par}~                                         \\
+%                                                                         \ \\
+%   ~\begin{linenumbers}~                                                   \\
+%       <text>                                                              \\
+%   ~\end{linenumbers}~                                                     \\
+%                                                                         \ \\
+%   <paragraph> ~{\linenumbers\par}~                                        \\
+%                                                                         \ \\
+%   ~\linenumbers~                                                          \\
+%     <text> ~\par~                                                         \\
+%   ~\nolinenumbers~                                                        \\
+%                                                                         \ \\
+%   ~\linenumbers~                                                          \\
+%   <paragraph> ~{\nolinenumbers\par}~                                      \\
+%                                                                  \end{verse}
+%
+%
+%                                                                 \subsection{
+%                 Customization hooks
+%                                                                            }
+% There are several hooks to customize the appearance of the
+% line numbers, and some low level hooks for special
+% effects. 
+%                                                     \begin{description}\item
+% [|\thelinenumber]                                                     \ \par
+%     This macro should give the representation of the line
+%     number in the \LaTeX-counter ~linenumber~.  The
+%     default is provided by \LaTeX:                              \par$\qquad$
+%         ~\arabic{linenumber}~
+%                                                                        \item
+% [|\makeLineNumberLeft]                                                \ \par
+%     This macro is used to attach a line number to the left
+%     of the text page.  This macro should fill an ~\hbox to 0pt~ 
+%     which will be placed at the left margin of the
+%     page, with the reference point aligned to the line to
+%     which it should give a number.  Please use the macro
+%     ~\LineNumber~ to refer to the line number. 
+%
+%     The default definition is                                   \par$\qquad$
+%         ~\hss\linenumberfont\LineNumber\hskip\linenumbersep~
+%                                                                        \item
+% [|\makeLineNumberRight]                                               \ \par
+%     Like ~\makeLineNumberLeft~, but for line numbers on
+%     the right margin.
+%
+%     The default definition is                                   \par$\qquad$
+%        ~\linenumberfont\hskip\linenumbersep\hskip\textwidth~    \par$\qquad$
+%        ~\hbox to\linenumberwidth{\hss\LineNumber}\hss~
+%                                                                        \item
+% [|\linenumberfont]                                                    \ \par
+%     This macro is initialized to                                \par$\qquad$
+%         ~\normalfont\tiny\sffamily~
+%                                                                        \item
+% [|\linenumbersep]                                                     \ \par
+%     This dimension register sets the separation of the
+%     linenumber to the text. Default value is ~10pt~.
+%                                                                        \item
+% [|\linenumberwidth]                                                   \ \par
+%     This dimension register sets the width of the line
+%     number box on the right margin.  The distance of the
+%     right edge of the text to the right edge of the line
+%     number is ~\linenumbersep~ + ~\linenumberwidth~. The
+%     default value is ~10pt~.  
+%                                                                        \item
+% [|\theLineNumber] (for wizards)                                       \ \par
+%     This macro is called for printing a ~\newlabel~ entry
+%     to the aux-file.  Its definition depends on the mode.
+%     For running line numbers it's just ~\thelinenumber~,
+%     while in pagewise mode, the page offset subtraction
+%     is done in here.
+%                                                                        \item
+% [|\makeLineNumber] (for wizards)                                      \ \par
+%     This macro produces the line numbers.  The definition
+%     depends on the mode.  In the running line numbers
+%     mode it just expands ~\makeLineNumberLeft~.
+%                                                                        \item
+% [|\LineNumber] (for wizards)                                          \ \par
+%     This macro is called by ~\makeLineNumber~ to typeset
+%     the line number.  This hook is changed by the modulo
+%     mechanism.
+%                                                            \end{description}
+%                                                             \end{document}%D
+------------------------------------------------------------------------------
+
+echo "expect errors for unknown commands 'iffalse' and 'fi'";# SHELL
+awk '/A[W]K/' lineno.sty | awk -f - lineno.sty >lineno.tex;  # SHELL
+latex lineno; latex lineno; latex lineno; latex lineno;      # SHELL
+
+awk '/DOC A [W] K/' lineno.sty | awk -f - lineno.sty >lineno.doc; # DOC SH
+
+BEGIN{DOC=-1;                                     # AWK DOC A W K
+ BEGINCODE = "\\begin{code}\\begin{verbatim}";    # AWK
+ ENDCODE   = "\\end{verbatim}\n\\end{code}";   }  # AWK
+ BEGINCODE = "%    \\begin{macrocode}";           #     DOC A W K
+ ENDCODE   = "%    \\end{macrocode}";          }  #     DOC A W K
+/^[ \t]*$/ { ECNT++; next; }                      # AWK DOC A W K
+/\\documentclass/{ sub("article","ltxdoc") }      #     DOC A W K
+/%D$/      { sub("^%* *",""); sub("%D$","");      #     DOC A W K
+             print > "lineno.drv"; next        }  #     DOC A W K
+/^%%/      { next; }                              # AWK DOC A W K
+/^%/       { if (!DOC) { print ENDCODE; }         # AWK DOC A W K
+             DOC=1; ECNT=0;                       # AWK DOC A W K
+             sub("^% *","");                      # AWK
+             sub("^% *","% ");                    #     DOC A W K
+             print; next;                      }  # AWK DOC A W K
+DOC<0      { next }                               # AWK DOC A W K
+/^-+-$/    { if (!DOC) print ENDCODE; exit }      # AWK DOC A W K
+{ if (DOC) { ECNT=DOC=0; print BEGINCODE; }       # AWK DOC A W K
+  while (ECNT>0) { print " "; ECNT--; }           # AWK DOC A W K
+  print $0;                                    }  # AWK DOC A W K
+