blob: 590896b08159804cc33fb5acd0f8f6594834e523 [file] [log] [blame]
\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 1.1.1.1 2005/05/13 16:03:16 mh124079 Exp $
%%%
%%% Copyright 1995--2003 Stephan I. B"ottcher <boettcher@physik.uni-kiel.de>
%%%
%%% 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.10a 2003/11/12
% }\\\ \\
% A \LaTeX\ package to attach
% \\ Line numbers to paragraphs
% }\author{
% Stephan I. B\"ottcher
% }\date{
% boettcher@physik.uni-kiel.de
%% \\ stephan@nevis.columbia.edu
%% \\ 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{styles/lineno}
[2003/11/12 line numbers on paragraphs v3.10a]
%% 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
%% v3.09 2003/01/14 SIB: hyperref detection fix
%% v3.10 2003/04/15 FMi: \MakeLineNo fix for deep boxes
%% v3.10a 2003/11/12 Uwe Lück: \lineref typo fix
%%
%% Acknowledgements:
%% v3.06: Donald Arseneau, pointed to mparhack.sty.
%% v3.07+: Frank Mittelbach, points out inconsistencies in the
%% user interface.
%% v3.10: Frank Mittelbach \MakeLineNo fix for deep boxes
%
% \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.
%
% (New v3.10) Frank Mittelbach points out that box255 may be
% less deep than the last box inside, so he proposes to
% measure the page depth with ~\boxmaxdepth=\maxdimen~.
% (/New v3.10)
\def\MakeLineNo{%
\boxmaxdepth\maxdimen\setbox\z@\vbox{\unvbox\@cclv}%
\@tempdima\dp\z@ \unvbox\z@
\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) (Fixed in v3.09) We try
% to be smart, and test ~\AtBeginDocument~ if the ~nameref~
% package is loaded, but ~hyperref~ postpones the loading of
% ~nameref~ too, so this is all in vain.
\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@linenumber\c@runninglinenumber
\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