\iffalse; awk '/S[H]ELL1/' lineno.sty|sh;exit; ... see bottom for .tex documentation ... Macro file lineno.sty for LaTeX: attach line numbers, refer to them. \fi \def\fileversion{v4.1c} \def\filedate{2005/01/10} %VERSION %%% Copyright 1995--2003 Stephan I. B"ottcher ; %%% Copyright 2002--2004 Uwe L"uck, http://www.contact-ednotes.sty.de.vu %%% for version 4 and code from former Ednotes bundle %%% --author-maintained. %%% %%% This file can be redistributed and/or modified under %%% the terms of the LaTeX Project Public License; either %%% version 1.3a of the License, or any later version. %%% The latest version of this license is in %%% http://www.latex-project.org/lppl.txt %%% We did our best to help you, but there is NO WARRANTY. % %%% $Id: lineno.sty,v 1.1 2011/07/14 12:08:38 martinee Exp $ %% was v4.00. % \title{\texttt{\itshape %% %% (UL 2004/10/09:) Italic TT is evil %% %% ... or nice front page layout!? %% % lineno.sty \ \fileversion\ \filedate % \unskip}\\\ \\ % A \LaTeX\ package to attach % \\ line numbers to paragraphs % \unskip}\author{% % Stephan I. B\"ottcher % \\ Uwe L\"uck % \unskip}\date{% % boettcher@physik.uni-kiel.de % \\ http://www.contact-ednotes.sty.de.vu %% \\ stephan@nevis.columbia.edu %% \\ Stephan.Boettcher@cern.ch % \\} % % \documentclass[a4paper,12pt]{article}%D % \usepackage{lineno}%D %% %% (New v4.00) % \catcode`\_\active\let_~ %% %% Beware math!? (/New v4.00) % \def~{\verb~} % \let\lessthan< % \catcode`\<\active % \def<#1>{$\langle${\itshape#1}\/$\rangle$} % \catcode`\|\active %% (New v4.1: \tt star; in box anyway.) % \def|#1{\ttfamily\string#1} %% \def|#1{{\ttfamily\string#1}} %% (/New v4.1) % \newenvironment{code} % {\par\runninglinenumbers % \modulolinenumbers[1]% % \linenumbersep.3em % \footnotesize % \def\linenumberfont % {\normalfont\tiny\itshape}} % {} %% %% (New v4.00) % {\makeatletter\gdef\scs#1{\texttt % {\protect\@backslashchar#1}}} % \def\old{\par\footnotesize} %% %% (/New v4.00) %% %% (New v4.1) % {\catcode`\/\active % \gdef\path{\begingroup\catcode`\/\active % \let/\slash\dopath} % \gdef\dopath#1{\slash\unpenalty#1\endgroup}} %% %% (/New v4.1) % % \begin{document}%D %% \DocInput{lineno}%D % \pagewiselinenumbers % \maketitle % \tableofcontents % \sloppy % %% %% New v4.00: `...section{%' + \unskip % \section{% % Introductions %% %% New v4.00: `s' % \unskip} % % (New v4.00) Parts of former first section % have been rendered separate subsections for package % version_v4.00. (/New v4.00) % % \subsection{% % Introduction to versions $\textrm{v}\lessthan4$ % \unskip} % % 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 too well with displaymath. % ~\footnote~s are a problem, especially when they % are split, but we may get there. % (New v4.00 UL) Version v4.00 overcomes the problem, I believe. % (/UL /New v4.00) % % 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. % % \subsection{% % Introduction to versions v4.00 and v4.1 (UL) % \unskip} % % lineno.sty has been maintained by Stephan until version_v3.14. % From version_v4.00 onwards, maintenance is shifting towards % Uwe L\"uck (UL), who is the author of v4\dots code and of v4\dots % changes in documentation. This came about as follows. % % Since late 2002, Christian Tapp and Uwe L\"uck have employed % lineno.sty for their ednotes.sty, a package supporting % critical editions---cf. % \begin{verse}\ttfamily % http://www.homepages.ucl.ac.uk/\~{}ucgadkw/edmac/ % \end{verse} % ---while you find ednotes.sty and surrounding files in % CTAN folder \path{macros/latex/contrib/ednotes}. % % Soon, some weaknesses of lineno.sty showed up, mainly since % Christian's critical editions (using ednotes.sty) needed lots % of ~\linelabel~s and footnotes. (These weaknesses are due to % weaknesses of \LaTeX's ~\marginpar~ mechanism that Stephan % used for ~\linelabel~.) So we changed some lineno.sty % definitions in some extra files, which moreover offered new % features. We sent these files to Stephan, hoping he would take % the changes into lineno.sty. However, he was too short of time. % % Writing a TUGboat article on Ednotes in 2004, we hoped to % reduce the number of files in the Ednotes bundle and so asked % Stephan again. Now he generously offered maintenance to me, so % I could execute the changes on my own. % % The improvements are as follows: % \begin{itemize}\item % [(i)] Footnotes placement approaches intentions better % (footnotes formerly liked to pile up at late pages). % \item % [(ii)] The number of ~\linelabel~s in one paragraph is no longer % limited to 18. % \item % [(iii)] ~\pagebreak~, ~\nopagebreak~, ~\vspace~, and the star % and optional versions of ~\\~ work as one would expect % (section_\ref{s:MVadj}). %% Added for v4.1 % \item % [(iv)] A command is offered which chooses the first line number % to be printed in the margin % (subsection_\ref{ss:Mod}). %% Added for v4.1 % \item % [(v)] (New v4.1) \LaTeX\ tabular environments (optionally) % get line numbers as well, and you can refer to them in the % usual automatic way. (It may be considered a shortcoming that, % precisely, \emph{rows} are numbered, not lines. See % subsection_\ref{ss:Tab}.) % \item % [(vi)] We are moving towards referring to math items % (subsection_\ref{ss:MathRef} and the hooks in % subsection_\ref{ss:LL}). % (/New v4.1) % \end{itemize} % (Thanks to Stephan for making this possible!) % % You may trace the earlier developments of these changes by % requesting our files linenox0.sty, linenox1.sty, and % lnopatch.sty. Most of our changes have been in linenox0.sty. % Our linenox1.sty has extended linenox0.sty for one single % purpose in a not very stable way. %% (See ~\linenumberpar~ below). % lnopatch.sty has done the first line number thing referred % to in case_(iv) up to now. % (New v4.1) % Case_(v) earlier was provided by our edtab02.sty---now % called `edtable.sty'. % (/New v4.1) % % Ednotes moreover profits from Stephan's offer with regard % to the documentation of our code which yielded these % improvements formerly. This documentation now becomes % printable, being part of the lineno.sty documentation. % % Of course, Stephan's previous lineno.sty versions were a great % and ingenious work and exhibit greatest \TeX pertise. I never % could have done this. I learnt a lot in studying the code when % Christian pointed out strange output results and error % messages, and there are still large portions of lineno.sty % which I don't understand (consider only pagewise numbering of % lines). Fortunately, Stephan has offered future help if % needed.---My code for attaching line numbers to \emph{tabular % environments} (as mentioned above, now still in % edtable.sty) %% %% TODO % developed from macros which Stephan and Christian experimented % with in December 2002. Stephan built the basics. % (However, I then became too proud to follow his advice only to % use and modify longtable.sty.) % % There are some issues concerning use of counters on which I % don't agree with Stephan and where I would like to change the % code if lineno.sty is ``mine'' as Stephan offered. However, % Stephan is afraid of compatibility problems from which, in % particular, his wife could suffer in the near future. So he % demanded that I change as little as possible for my first % version. Instead of executing changes that I plan I just offer % my opinions at the single occasions. I hope to get in touch % this way with users who consider subtle features vital which I % consider strange. % % On the other hand, the sections on improvements of the % implementation have been blown up very much and may be tiring % and litte understandable for mere \emph{users}. These users % may profit from the present presentation just by jumping to % sections_\ref{s:Opts} and_\ref{s:UserCmds}. There is a user's % guide ulineno.tex which may be even more helpful, but it has % not been updated for a while. %% TODO % % \subsection{% % Availability % \unskip} % % In case you have found the present file otherwise than from % CTAN: A recent version and documentation of this package % should be available from CTAN folder % \path{macros/latex/contrib/lineno}. % Or mail to one of the addresses at top of file. % % \subsection{% % Introductory code % \unskip} % % This style option is written for \LaTeXe, November 1994 or later, % since we need the ~\protected@write~ macro. % % (New v4.00) And we use ~\newcommand*~ for % controlling length of user macro arguments, which has been % available since December 1994. %% \NeedsTeXFormat{LaTeX2e}[1994/12/01] %% [1994/11/04] \ProvidesPackage{lineno} [\filedate\space line numbers on paragraphs \fileversion] % (/New v4.00) %% %% History of versions: %% v1.00 1995/03/31 SIB: first release for Petra's 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 %% v4.00 2004/09/02 UL: included linenox0, linenox1, lnopatch code with %% documentation, usually indicated by `New v4.00'; %% discussions of old code, indicated by `UL'; %% LPPL v.1 -> LPPL v1.3, `program' -> `file'; %% first lines with \filedate and \fileversion, %% according nawk lines; `November 1994 or later', %% some earlier documentation typos (including a few %% bad minus signs), { -> {% and } -> \unskip} at %% line ends (so, e.g., alignment in TOC works); \scs. %% 2004/09/03 UL: removed everything which indicated that the %% present file were named `lineno4.sty'. %% v4.1 2004/09/19 UL: Inserted Stephan's identification line, removed %% some TODOs and remarks from v4.00. %% 2004/10/04 UL: Added acknowledgement for Daniel Doherty; %% `(New v4.00)' with [|\firstlinenumber]; changed %% TODOs; Refining -> Redefining (\vadjust). %% 2004/10/05 UL: ednmath0 -> mathrefs; \catcode`\~ -> \active; %% \path; refined section on options `mathrefs'; %% changes in introduction. %% 2004/10/06 UL: Changed/removed TODOs, e.g., for edtable.sty. %% 2004/10/11 UL: Reminders: linenox0/1/lnopatch.sty obsolete; %% \tt star in list of commands. %% 2004/10/12 UL: Corrected blank lines in lineno.tex. %% 2004/10/19 UL: Fixed minor typos; remark on \if@LN@edtable. %% v4.1a 2004/11/07 UL: LPPL v1.3a. %% v4.1b 2004/11/13 UL: Comment on \outputpenalty values. %% v4.1c 2005/01/10 UL: Contact via http. %% %% %% 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 %% v4.00: Daniel Doherty points out clash of \pagewise... with resetting %% page number. % % \section{% % Put the line numbers to the lines % \unskip} % % (New v4.00) This section contained the most % basic package code previously. For various purposes of % version_4\dots, much of these basics have been to be modified. % Much of my (UL's) reasoning on these modifications has been to % be reported. Sorry, the present section has been blown up % awfully thus and contains ramifications that may be difficult % to trace. We add some ~\subsection~ commands in order to cope % with the new situation. (/New v4.00) % % \subsection{% % Basic code of lineno.sty \scs{output} % \unskip}\label{ss:output} % % 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 % ~\penalty~$-30000$. The lineno penalty range was % shrunk to $-188000 \dots -32000$. (/New v3.04) % (UL) New values are listed below (11111f.). (/UL) \newcount\linenopenalty\linenopenalty=-100000 % (UL) Hm. It is never needed below % that this is a counter. ~\def\linenopenalty{-100000\relax}~ % would do. (I guess this consumes more memory, but it % is more important to save counters than to save memory.) % I was frightened by ~-\linenopenalty~ below, but indeed % \TeX\ interprets the string ~--100000~ as 100000. % Has any user or extension package writer ever called % ~\linenopenalty=xxx~, or could I really change this?---The % counter is somewhat faster than the macro. Together with the % compatibility question this seems to support keeping the % counter. (???) Note that Stephan chose ~\mathchardef~ below, % so his choice above seems to have been deliberate. (/UL) \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) % % (New v4.00) Two further complications are added. %% %% TODO v4.2: Or three, ~\@nobreakfalse~ after ~\MakeLineNo~ %% for getting rid of ~\my@nopagebreak~. % \begin{itemize}\item % [(i)] Problems with footnotes formerly resulted from % \LaTeX's ~\@reinserts~ in ~\@specialoutput~ which Stephan's % ~\linelabel~ called via the ~\marginpar~ mechanism. % \item % [(ii)] \LaTeX\ commands using ~\vadjust~ formerly didn't work % as one would have hoped. The problem is as follows: % Printing the line number results from % a box that the output routine inserts at the place of the % ~\interlinepenalty~. ~\vadjust~ items appear \emph{above} the % ~\interlinepenalty~ (\TeX book p._105). So ~\pagebreak~, e.g., % formerly sent the line number to the next page, while the % penalty from ~\nopagebreak~ could not tie the following line, % since it was screened off by the line number box.---Our trick % is putting the ~\vadjust~ items into a list macro from which % the output routine transfers them into the vertical list, % below the line number box. % \end{itemize} % In this case_(ii), like in case_(i), footnotes would suffer % if ~\holdinginserts~ were non-positive. Indeed, in both % cases_(i) and_(ii) we tackle the footnote problem by extending % that part of Stephan's output routine that is active when % ~\holdinginserts~ is positive. This extension writes the line % number ~\newlabel~ to the .aux file (which was formerly done % under $~\holdinginserts~=-3$) and handles the ~\vadjust~ % items.---To trigger ~\output~ and its ~\linelabel~ or, resp., % ~\vadjust~ part, the list of signal penalties started % immediately before is increased here (first for ~\linelabel~, % second for postponed ~\vadjust~ items): \mathchardef\@Mllbcodepen=11111 \mathchardef\@Mppvacodepen=11112 % (/New v4.00) \let\@LN@output\output \newtoks\output \output=\expandafter{\the\@LN@output} % Now we add two cases to Stephan's output routine. (New v4.00) \@LN@output={% \LineNoTest \if@tempswa %% %% (UL) Learnt that even in def.s blank line means ~\par~. %% to leave visual space in present file with having a %% blank line neither in present nor in .tex file, %% use double comment mark (`%%'). (/UL) %% % (New v4.00) % We insert recognition of waiting ~\linelabel~ items--- %% \ifnum\outputpenalty=-\@Mllbcodepen \WriteLineNo %% % ---and of waiting ~\vadjust~ items: %% \else \ifnum\outputpenalty=-\@Mppvacodepen \PassVadjustList \else %% % Now we give control back to Stephan. % (/New v4.00) \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 % (New v4.00) % Two new ~\fi~s for the ~\linelabel~ and ~\vadjust~ tests--- %% \fi \fi %% % ---and the remaining is %%%next three lines are % Stephan's code again: % (/New v4.00) %% \else \MakeLineNo \fi } % (New v4.00) Our new macros % ~\WriteLineNo~ and ~\PassVadjustList~ will be dealt with in % sections_\ref{s:LNref} and_\ref{ss:PVadj}. (/New v4.00) % % \subsection{% % \scs{LineNoTest} % \unskip} % % 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 %% % (UL) Following line renders previous line obsolete, doesn't it? (/UL) %% %% TODO v4.2 \my@nobreaktrue \fi \@tempswatrue \ifnum\outputpenalty>-\linenopenaltypar\else \ifnum\outputpenalty>-188000\relax \@tempswafalse \fi \fi } \def\my@nobreaktrue{\let\if@nobreak\iftrue} % (UL) I would prefer ~\@LN@nobreaktrue~.---I thought here were % another case of the save stack problem explained in \TeX book, % p._301, namely through both local and global changing % ~\if@nobreak~. However, ~\my@nobreak~ is called during % ~\@LN@output~ only, while ~\@nobreaktrue~ is called by \LaTeX's % ~\@startsection~ only. The latter never happens during % ~\@LN@output~. So there is no local value of ~\if@nobreak~ on % save stack when ~\@nobreaktrue~ acts, since ~\the\@LN@output~ % (where ~\@LN@output~ is a new name for the original ~\output~) % is executed within a group (\TeX book p._21). %% %% 2004/09/19 Removed nonsense here according to Stephan 2004/09/02. %% % (/UL) % % \subsection{% % \scs{LineNoHoldInsertsTest} % \unskip} % % (New v4.00) No change here! % Just a separate subsection. (/New v4.00) \def\LineNoHoldInsertsTest{% \ifnum\holdinginserts=3\relax \@tempswafalse \fi } % % \subsection{% % \scs{MakeLineNo}: Actually attach line number % \unskip}\label{ss:MLN} % % 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}. % % (UL) I needed a while to understand % the sentence on incrementing. Correctly: writing the % ~\newlabel~ to the .aux file is triggered by the signal % penalty that ~\end@float~ inserts via ~\vadjust~. % However, this could be changed by our new ~\PostponeVadjust~. % After ~\c@linenumber~ has been introduced as a \LaTeX\ % counter, it might be preferable that it behaved like standard % \LaTeX\ counters which are incremented shortly before printing. % But this may be of little practical relevance in this case, % as ~\c@linenumber~ is driven in a very non-standard % way.---However still, this behaviour of ~\c@linenumber~ % generates a problem with our edtable.sty. %% \unskip---Before, %% I thought that Stephan had reported his reasoning incorrectly %% and rather did this because of his ~\resetlinenumber~ which %% initializes ~\c@linenumber~ to 1 instead of 0---the latter is %% usual with \LaTeX\ counters. Cf._additional comment at %% ~\resetlinenumber~. % (/UL). % % 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) % % (UL, New v4.00) We also resume the matter of % ~\vadjust~ items that was started in section_\ref{ss:output}. % % \TeX\ puts only nonzero interline % penalties into the vertical list (\TeX book p._105), while % lineno.sty formerly replaced the signal interline penalty by % something closing with an explicit penalty of the value that % the interline penalty would have without lineno.sty. % This is usually 0. Now, explicit vertical penalties can be % very nasty with respect to ~\nopagebreak~, e.g., a low (even % positive) ~\widowpenalty~ may force a widow where you % explicitly tried to forbid it by ~\nopagebreak~ % (see explanation soon below). % The ~\nopagebreak~ we create here would never work if all % those zero penalties were present.---On % the other hand, we cannot just omit Stephan's zero penalties, % because \TeX\ puts a penalty of 10000 after what lineno.sty % inserts (\TeX book p._125). This penalty must be overridden % to allow page breaks between ordinary lines. To revive % ~\nopagebreak~, we therefore replace those zero (or low) % penalties by penalties that the user demanded by % ~\nopagebreak~.---This mechanism is not perfect and does not % exactly restore the original \LaTeX\ working of ~\pagebreak~ % and ~\nopagebreak~. Viz., if there are several vertical % penalties after a line which were produced by closely sitting % ~\[no]pagebreak~s, without lineno.sty the lowest penalty would % be effective (cf._\TeX book exercise_14.10). Our mechanism, by % contrast, chooses the \emph{last} user-set penalty of the line % as the effective one. It would not be very difficult to come % more close to the original mechanism, but until someone urges % us we will cling to the present simple way. You may consider an % advantage of the difference between our mechanism and the % original one that the user here can actually override low % penalties by ~\nopagebreak~, which may be what a lay \LaTeX\ % user would expect.---Zero glue would do instead of zero % penalty! This could make things easier. Maybe next time. % (/UL, /New v4.00) \def\MakeLineNo{% \boxmaxdepth\maxdimen\setbox\z@\vbox{\unvbox\@cclv}% \@tempdima\dp\z@ \unvbox\z@ \sbox\@tempboxa{\hbox to\z@{\makeLineNumber}}% %% % (New v4.00) Previously, % \begin{old}\begin{verbatim} % % \stepcounter{linenumber}% % \end{verbatim} % \end{old} %% %% TODO: Still first `\begin{old}'? % followed. (Of course, there was no % comment mark; I put it there to make % reading the actual code easy.) % % (UL) I wondered about this. Why not just % ~\global\advance\c@linenumber\@ne~? %% TODO v4.1+: own line % section_\ref{appearance}. %% %% TODO v4.2: This: extra subsection!? % OK, I keep it. (/UL) % % But then, our edtable.sty and its ~longtable~ option % should use it as well. So use a shorthand supporting % uniformity. You can even use it as a hook for choosing % ~\global\advance\c@linenumber\@ne~ instead of our choice. %% \stepLineNumber % (/New v4.00) %% \dp\@tempboxa=\@tempdima\ht\@tempboxa=\z@ \nointerlineskip\kern-\@tempdima\box\@tempboxa %% % (New v4.00) % The line number has now been placed (it may be invisible % depending on the modulo feature), so we can insert the % ~\vadjust~ items. We cannot do this much later, because % their right place is above the artificial interline % penalty which Stephan's code will soon insert % (cf._\TeX book p._105). The next command is just ~\relax~ % if no ~\vadjust~ items have been accumulated for the % current line. Otherwise it is a list macro inserting % the ~\vadjust~ items and finally resetting itself. % (This is made in section_\ref{ss:PVadj} below.) % If the final item is a penalty, it is stored so it can % compete with other things about page breaking. %% \@LN@do@vadjusts \count@\lastpenalty %% % At this place, % \begin{old}\begin{verbatim} % % \ifnum\outputpenalty=-\linenopenaltypar\else % \end{verbatim} % \end{old} % originally followed. We need something \emph{before} the % ~\else~: %% \ifnum\outputpenalty=-\linenopenaltypar \ifnum\count@=\z@ \else %% % So final ~\pagebreak[0]~ or ~\nopagebreak[0]~ has no % effect---but this will make a difference after headings only, % where nobody should place such a thing anyway. %% \xdef\@LN@parpgbrk{\penalty\number\count@\relax \gdef\noexpand\@LN@parpgbrk{\kern\z@}}% %% %% TODO v4.1+: Stephan's advice % That penalty will replace former ~\kern\z@~ in % ~\linenumberpar~, see section_\ref{s:CtrlLN}.---A % few days earlier, I tried to send just a penalty value. % However, the ~\kern\z@~ in ~\linenumberpar~ is crucial, % as I then found out. See below.---The final penalty is % repeated, but this does no harm. (It would not be very % difficult to avoid the repeating, but it may even be % less efficient.) It may be repeated due to the previous % ~\xdef~, but it may be repeated as well below in the % present macro where artificial interline penalty is to % be overridden. %% \fi \else %% % (/New v4.00) %% \@tempcnta\outputpenalty \advance\@tempcnta -\linenopenalty %% % (New v4.00) % \begin{old}\begin{verbatim} % % \penalty\@tempcnta % \end{verbatim} % \end{old} % followed previously. To give ~\nopagebreak~ a chance, % we do %% \penalty \ifnum\count@<\@tempcnta \@tempcnta \else \count@ \fi %% % instead.---In linenox0.sty, the ~\else~ thing once was omitted. % Sergei Mariev's complaint (thanks!) showed that it is vital % (see comment before ~\MakeLineNo~). % The remaining ~\fi~ from previous package version closes the % ~\ifnum\outputpenalty~\dots % (/New v4.00) %% \fi } % (New v4.00) \newcommand\stepLineNumber{\stepcounter{linenumber}} % For reason, see use above. (/New v4.00) %% %% TODO v4.2: ~\newcommand~ more often!? % % \section{% % Control line numbering % \unskip}\label{s:CtrlLN} % % 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 % (UL) And needs ~\linenoprevgraf~ % to be a counter? Perhaps there may be a paragraph having % thousands of lines, so ~\mathchardef~ doesn't suffice (really??). %% %% %% TODO: limitations of lines per paragraph elsewhere? %% %% Signal penalties, e.g.!? ~\deadcycles~!? %% % A macro ending on ~\relax~ might suffice, but would be % somewhat slow. I think I will use ~\mathchardef~ next time. % Or has any user used ~\linenoprevgraf~? (/UL) \def\linenumberpar{\ifvmode\@@@par\else\ifinner\@@@par\else \advance\interlinepenalty \linenopenalty \linenoprevgraf\prevgraf \global\holdinginserts3% \@@@par \ifnum\prevgraf>\linenoprevgraf \penalty-\linenopenaltypar \fi %% % (New v4.00) % \begin{old}\begin{verbatim} % % \kern\z@ % \end{verbatim} % \end{old} % was here previously. What for? % According to \TeX book p._125, Stephan's % interline penalty is changed into 10000. At the end of a % paragraph, the ~\parskip~ would follow that penalty of 10000, % so there could be a page break neither at the % ~\parskip~ nor at the ~\baselineskip~ (\TeX book p. 110)---so % there could never be a page break between two paragraphs. % So something must screen off the 10000 penalty. % Indeed, the ~\kern~ is a place to break. % (Stephan once knew this: see `allow pagebreaks' above.) % % Formerly, I tried to replace ~\kern\z@~ by % \begin{old}\begin{verbatim} % % \penalty\@LN@parpgpen\relax % \end{verbatim} % \end{old} % ---but this allows a page break after heading. So: %% \@LN@parpgbrk %% % After heading, ~\kern\z@~ resulting from previous line % (see below) is followed by ~\write~ or ~\penalty10000~, % so causes no page break. % % These and similar changes were formerly done by linenox1.sty. % (/New v4.00) %% \global\holdinginserts0% \advance\interlinepenalty -\linenopenalty \fi\fi } %% %% \global\let\@LN@parpgpen\z@ %% UL 2004/08/11 %% TODO v4.2: remove. %% % (New v4.00) Initialize ~\@LN@parpgbrk~: \gdef\@LN@parpgbrk{\kern\z@} % (/New v4.00) % % 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 ~[~~]~. % % (New v4.00) We add ~\ifLineNumbers~ etc.\ since % a number of our new adjustments need to know whether % linenumbering is active. This just provides a kind of % shorthand for ~\ifx\@@par\linenumberpar~; moreover it is % more stable: who knows what may happen to ~\@@par~?---A % caveat: ~\ifLineNumbers~ may be wrong. E.g., it may be % ~\iffalse~ where it acts, while a ~\linenumbers~ a few % lines below---in the same paragraph---brings about that % the line where the ~\ifLineNumbers~ appears gets a % marginal number. %% Better implementation suggested below. \newif\ifLineNumbers \LineNumbersfalse \def\linenumbers{\LineNumberstrue \let\@@par\linenumberpar % \begin{old}\begin{verbatim} % % \def\linenumbers{\let\@@par\linenumberpar % \end{verbatim} % \end{old} % (/New v4.00) %% \ifx\@par\@@@par\let\@par\linenumberpar\fi \ifx\par\@@@par\let\par\linenumberpar\fi \@ifnextchar[{\resetlinenumber}%] {\@ifstar{\resetlinenumber}{}}% } % (New v4.00) \def\nolinenumbers{\LineNumbersfalse \let\@@par\@@@par % \begin{old}\begin{verbatim} % % \def\nolinenumbers{\let\@@par\@@@par % \end{verbatim} % \end{old} % (/New v4.00) %% \ifx\@par\linenumberpar\let\@par\@@@par\fi \ifx\par\linenumberpar\let\par\@@@par\fi } % (New v4.00) Moreover, it is useful to switch to % ~\nolinenumbers~ in ~\@arrayparboxrestore~. We postpone this % to section_\ref{ss:ReDef} where we'll have an appending macro % for doing this. (/New v4.00) % % 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 environment to make %% TODO 4.1+: which? \ref!? % 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. % % (UL) I'm drawing the following % private thoughts of Stephan's to publicity so that others may % think about them---or to remind myself of them in an efficient % way. (/UL) %% UL changed `%%%' to `% %' below. % \begin{old}\begin{verbatim} % % 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. % \end{verbatim} % \end{old} \@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 % \unskip} % % 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. % % (UL) Newly, we could replace first lines % by ~\ifLineNumbers~. (/UL) \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 % \unskip}\label{s:LNref} % % The only way to get a label to a line number in a % paragraph is to ask the output routine to mark it. % % (New v4.00) The following two paragraphs don't hold any % longer, see below. (/New v4.00) % \begin{old}\begin{verbatim} % % 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@~. % \end{verbatim} % \end{old} % 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) % % (New v4.00) % We fire the ~\marginpar~ mechanism, so we leave \LaTeX's % ~\@addmarginpar~ untouched. % \begin{old}\begin{verbatim} % % \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} % \end{verbatim} % \end{old} % OK, we keep Stephan's ~\@LN@ExtraLabelItems~: % (/New v4.00) \let\@LN@ExtraLabelItems\@empty % (New v4.00) % We imitate the ~\marginpar~ mechanism without using the % ~\@freelist~ boxes. ~\linelabel~ will indeed place a signal % penalty (~\@Mllbcodepen~, new), and it will put a label into % some list macro ~\@LN@labellist~. A new part of the output % routine will take the labels from the list and will write % ~\newlabel~s to the .aux file. % % The following is a version of \LaTeX's ~\@xnext~. \def\@LN@xnext#1\@lt#2\@@#3#4{\def#3{#1}\gdef#4{#2}} % This takes an item ~#1~ from a list ~#4~ into ~#3~; % to be used as ~\expandafter\@LN@xnext#4\@@#3#4~. % Our lists use ~\@lt~ after each item for separating. % Indeed, there will be another list macro which can % appear as argument ~#4~, this will be used for moving % ~\vadjust~ items (section_\ref{ss:PVadj}). % The list for ~\linelabel~s is the following: \global\let\@LN@labellist\@empty % The next is the new part of the output routine writing the % ~\newlabel~ to the .aux file. Since it is no real page output, % the page is put back to top of the main vertical list. \def\WriteLineNo{% \unvbox\@cclv \expandafter \@LN@xnext \@LN@labellist \@@ \@LN@label \@LN@labellist \protected@write\@auxout{}{\string\newlabel{\@LN@label}% {{\theLineNumber}{\thepage}\@LN@ExtraLabelItems}}% } % (/New v4.00) % % \subsection{% % The \scs{linelabel} command % \unskip}\label{ss:LL} % To refer to a place in line ~\ref{~~}~ at page % ~\pageref{~~}~ you place a ~\linelabel{~~}~ at % that place. % % \linelabel{demo} % \marginpar{\tiny\raggedright % See if it works: This paragraph % starts on page \pageref{demo}, line % \ref{demo}. % \unskip}% % 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 % decide whether to print line numbers on this paragraph % or not. A ~\linelabel~ may legally appear earlier than % ~\linenumbers~. % % ~\linelabel~ % \begin{old}\begin{verbatim} % %, via a fake float number $-2$, %% new mechanism v4.00 % \end{verbatim} % \end{old} % 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~). % % (New v4.00) We aim at relaxing the previous condition. % We insert a hook ~\@LN@mathhook~ and a shorthand % ~\@LN@postlabel~ to support the ~mathrefs~ option which % allows ~\linelabel~ in math mode. % % The next paragraph is no longer valid. % \begin{old}\begin{verbatim} % % 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. % \end{verbatim} % \end{old} % (/New v4.00) \def\linelabel#1{% \ifvmode \ifinner \else \leavevmode \@bsphack \@savsk\p@ \fi \else \@bsphack \fi \ifhmode \ifinner \@parmoderr \else %% % (New v4.00) %% \@LN@postlabel{#1}% % \begin{old}\begin{verbatim} % % \@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 % \end{verbatim} % \end{old} % (/New v4.00) %% \@esphack %% % (New v4.00) % The ~\@ignorefalse~ was appropriate before because the % ~\@Esphack~ in ~\end@float~ set ~\@ignoretrue~. Cf._\LaTeX's % ~\@xympar~. (/New v4.00) %% \fi \else %% % (New v4.00) %% \@LN@mathhook{#1}% % \begin{old}\begin{verbatim} % % \@parmoderr % \end{verbatim} % \end{old} % Instead of complaining, you may just do your job. % (/New v4.00) %% \fi } % (New v4.00) The shorthand just does what happened % with linenox0.sty before ednmath0.sty (New v4.1: % now ~mathrefs~ option) appeared, and % the hook is initialized to serve the same purpose. % So errors come just where Stephan had built them in, % and this is just the \LaTeX\ ~\marginpar~ behaviour. \def\@LN@postlabel#1{\g@addto@macro\@LN@labellist{#1\@lt}% \vadjust{\penalty-\@Mllbcodepen}} \def\@LN@mathhook#1{\@parmoderr} % (/New v4.00) % % \modulolinenumbers[3] % \firstlinenumber{1} % \section{% % The appearance of the line numbers % \unskip}\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 % customize ~\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. % % (UL) ~\newcounter{linenumber}~ % was the only ~\newcounter~ in the whole package. What is % (or: ``was''!) its purpose (i.e., Stephan's reasoning)? % (In fact, Stephan couldn't remember his thoughts on % on similar questions---this is why I reason here as if I % were a historian.) % Firstly, there is the check whether the name has % been introduced earlier---forget about this. Secondly, % ~\thelinenumber~ is defined---we could do this on our own. % Note that ~\setcounter{linenumber}~ and % ~\addtocounter{linenumber}~ work even after % ~\newcount\c@linenumber~, without ~\newcounter~. % So the final (main) difference to ~\newcount~ is that % ~\stepcounter{linenumber}~ resets \LaTeX\ counters % that have been declared by % ~\newcounter{~~}[linenumber]~. % I wondered what this is needed for. % It reminds me of ``sublines'' which are dealt with in % John Lavagnino's and Dominik Wujastyk's EDMAC.---This % is the main reason why I think it is really better to % keep the ~\stepcounter~ facility and, so, % ~\newcounter~. Finally, I found another reason for % keeping it in section_\ref{ss:Mod}. % % 2004/12/11: The above list of effects of % ~\newcounter{linenumber}~ is not complete. % It must be added that this command causes ~\include~ % to save the final line number (plus 1) of the ~\included~ % part. This appears to me to be useful. % (/UL) % % (New v4.00) \newcommand*\resetlinenumber[1][1]{\c@runninglinenumber#1\relax} %% \newcommand\resetlinenumber[1][1]{\c@runninglinenumber#1} %% % Added ~\relax~, being quite sure that this does no harm % and is quite important, as with ~\setcounter~ etc. % I consider this a bug fix (although perhaps no user has % ever had a problem with this). (/New v4.00) % % (UL) %% Optional argument should better be ~\@ne~.---%% %% TODO v4.2 %% % I thought of incrementing ~\c@linenumber~ (which is the same as % ~\c@linenumber~ when ~\resetlinenumber~ has an effect at all) % \emph{before} printing (see what precedes ~\MakeLineNo~ above) % and of adding ~\advance\c@runninglinenumber\m@ne~ here % correspondingly. Even if incrementing is kept as it was: % Now that we have decided to use ~\stepcounter{linenumber}~ % for incrementing---in order to support ``subordinate'' counters % ~\c@foo~ that have been introduced by % ~\newcounter{foo}[linenumber]~---subordinate counters should be % reset here as well. This could be done as follows. % \begin{old}\begin{verbatim} % % \newcommand\resetlinenumber[1][1]{% % % \ifx\c@linenumber\c@runninglinenumber % % \c@linenumber#1\relax % % \advance\c@linenumber\m@ne % % \stepcounter{linenumber}% % % \else % % \PackageError{lineno}% % % {You can't reset line number in pagewise mode}% % % {This should suffice.}% % % \fi % % } % \end{verbatim} % \end{old} % But be careful! Note that ~\resetlinenumber~ acts locally only, % while ~\stepcounter~ acts globally!---Well, this is a problem % due to the received ~\resetlinenumber~! The received situation % raises the danger of misusing save stack---\TeX book p._301. % ~\c@linenumber~ can hardly be incremented in another way than % globally! This is a very serious reason to make % ~\resetlinenumber~ act globally!---I should have added % ~\global~ right now, but here I am afraid of a serious % compatibility problem. Stephan urged me to avoid such problems % this time. Moreover, note that section_\ref{s:UserCmds} says % that the commands can be used ``globally'' as well as % ``locally within groups''. Are we allowed to change this? % We might introduce a star form which acts globally indeed. % Or we just advise the user to precede the command with a ~\global~. %% %% TODO v4.2: %% \newcommand*\resetlinenumber[1][\@ne]{% %% \ifx\c@linenumber\c@runninglinenumber %% \global\c@linenumber#1\relax %% \global\advance\c@linenumber\m@ne %% \stepLineNumber %% \else %% \PackageError{lineno}%% Shorthand!? %% {You can't reset line number in pagewise mode}% %% {This should suffice.}% %% \fi %% } % (/UL) % % \subsection{% % Running line numbers % \unskip} % % 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 % \unskip} % % Difficult, if you think about it. The number has to be % printed when there is no means to know on which page it % will end up, except through the aux-file. My solution % is really expensive, but quite robust. % % With version ~v2.00~ the hashsize requirements are % reduced, because we do not need one controlsequence for % each line any more. But this costs some computation time % to find out on which page we are. % % ~\makeLineNumber~ gets a hook to log the line and page % number to the aux-file. Another hook tries to find out % what the page offset is, and subtracts it from the counter % ~\c@linenumber~. Additionally, the switch % ~\ifoddNumberedPage~ is set true for odd numbered pages, % false otherwise. \def\setpagewiselinenumbers{% \let\theLineNumber\thePagewiseLineNumber \let\c@linenumber\c@pagewiselinenumber \let\makeLineNumber\makePagewiseLineNumber } \def\makePagewiseLineNumber{\logtheLineNumber\getLineNumber \ifoddNumberedPage \makeLineNumberOdd \else \makeLineNumberEven \fi } % Each numbered line gives a line to the aux file % \begin{verse} % ~\@LN{~~}{~~}~ % \end{verse} % very similar to the ~\newlabel~ business, except that we need % an arabic representation of the page number, not what % there might else be in ~\thepage~. \def\logtheLineNumber{\protected@write\@auxout{}{% %% % (New v4.00) % As Daniel Doherty observed, the earlier line % \begin{old}\begin{verbatim} % % \string\@LN{\the\c@linenumber}{\noexpand\the\c@page}}} % \end{verbatim} % \end{old} % here may lead into an infinite loop when the user resets % the page number (think of ~\pagenumbering~, e.g.). % (UL) % Stephan and I brief\/ly discussed the matter and decided % to introduce a ``physical''-page counter to which % ~\logtheLineNumber~ refers. It was Stephan's idea to use % ~\cl@page~ for reliably augmenting the ``physical''-page % counter. However, this relies on the output routine once % doing ~\stepcounter{page}~. Before Stephan's % suggestion, I had thought of appending the stepping to % \LaTeX's ~\@outputpage~.---So the macro definition ends % as follows. %% \string\@LN{\the\c@linenumber}{% \noexpand\number\n@LN@truepage}}} \newcount\n@LN@truepage \g@addto@macro\cl@page{\global\advance\n@LN@truepage\@ne} % I had thought of offering more % features of a \LaTeX\ counter. However, the user should % better \emph{not} have access to this counter. ~\c@page~ % should suffice as a pagewise master counter.---To be sure, % along the present lines the user \emph{can} manipulate % ~\n@LN@truepage~ by ~\stepcounter{page}~. E.g., she might % do this twice in order to manually insert a photography. % Well, the physical-page counter will skip some values % then, but this will not disable pagewise line numbering. %% %% TODO v4.2: OK? % % The above usage of ~\g@addto@macro~ and ~\cl@page~ may be % not as stable as Stephan intended. His proposal used % ~\xdef~ directly. But he used ~\cl@page~ as well, and who % knows \dots{} And as to ~\g@addto@macro~, I have introduced % it for list macros anyway. % (/UL) (/New v4.00) % % From the aux-file we get one macro ~\LN@P~ for each % page with line numbers on it. This macro calls four other % macros with one argument each. These macros are % dynamically defined to do tests and actions, to find out % on which page the current line number is located. % % We need sort of a pointer to the first page with line % numbers, initiallized to point to nothing: \def\LastNumberedPage{first} \def\LN@Pfirst{\nextLN\relax} % The four dynamic macros are initiallized to reproduce % themselves in an ~\xdef~ \let\lastLN\relax % compare to last line on this page \let\firstLN\relax % compare to first line on this page \let\pageLN\relax % get the page number, compute the linenumber \let\nextLN\relax % move to the next page % During the end-document run through the aux-files, we % disable ~\@LN~. I may put in a check here later, to give % a rerun recommendation. \AtEndDocument{\let\@LN\@gobbletwo} % Now, this is the tricky part. First of all, the whole % definition of ~\@LN~ is grouped, to avoid accumulation % on the save stack. Somehow ~\csname~~\endcsname~ pushes % an entry, which stays after an ~\xdef~ to that . % % If ~\LN@P~ is undefined, initialize it with the % current page and line number, with the % \emph{pointer-to-the-next-page} pointing to nothing. And % the macro for the previous page will be redefined to point % to the current one. % % If the macro for the current page already exists, just % redefine the \emph{last-line-number} entry. % % Finally, save the current page number, to get the pointer to the % following page later. \def\@LN#1#2{{\expandafter\@@LN \csname LN@P#2C\@LN@column\expandafter\endcsname \csname LN@PO#2\endcsname {#1}{#2}}} \def\@@LN#1#2#3#4{\ifx#1\relax \ifx#2\relax\gdef#2{#3}\fi \expandafter\@@@LN\csname LN@P\LastNumberedPage\endcsname#1 \xdef#1{\lastLN{#3}\firstLN{#3}\pageLN{#4}{\@LN@column}{#2}\nextLN\relax}% \else \def\lastLN##1{\noexpand\lastLN{#3}}% \xdef#1{#1}% \fi \xdef\LastNumberedPage{#4C\@LN@column}} % The previous page macro gets its pointer to the % current one, replacing the ~\relax~ with the cs-token % ~\LN@P~. \def\@@@LN#1#2{{\def\nextLN##1{\noexpand\nextLN\noexpand#2}% \xdef#1{#1}}} % Now, to print a line number, we need to find the page, % where it resides. This will most probably be the page where % the last one came from, or maybe the next page. However, it can % be a completely different one. We maintain a cache, % which is ~\let~ to the last page's macro. But for now % it is initialized to expand ~\LN@first~, where the poiner % to the first numbered page has been stored in. \def\NumberedPageCache{\LN@Pfirst} % To find out on which page the current ~\c@linenumber~ is, % we define the four dynamic macros to do something usefull % and execute the current cache macro. ~\lastLN~ is run % first, testing if the line number in question may be on a % later page. If so, disable ~\firstLN~, and go on to the % next page via ~\nextLN~. \def\testLastNumberedPage#1{\ifnum#1<\c@linenumber \let\firstLN\@gobble \fi} % Else, if ~\firstLN~ finds out that we need an earlier % page, we start over from the beginning. Else, ~\nextLN~ % will be disabled, and ~\pageLN~ will run % ~\gotNumberedPage~ with four arguments: the first line % number on this column, the page number, the column % number, and the first line on the page. \def\testFirstNumberedPage#1{\ifnum#1>\c@linenumber \def\nextLN##1{\testNextNumberedPage\LN@Pfirst}% \else \let\nextLN\@gobble \def\pageLN{\gotNumberedPage{#1}}% \fi} % We start with ~\pageLN~ disabled and ~\nextLN~ defined to % continue the search with the next page. \long\def \@gobblethree #1#2#3{} \def\testNumberedPage{% \let\lastLN\testLastNumberedPage \let\firstLN\testFirstNumberedPage \let\pageLN\@gobblethree \let\nextLN\testNextNumberedPage \NumberedPageCache } % When we switch to another page, we first have to make % sure that it is there. If we are done with the last % page, we probably need to run \TeX\ again, but for the % rest of this run, the cache macro will just return four % zeros. This saves a lot of time, for example if you have % half of an aux-file from an aborted run, in the next run % the whole page-list would be searched in vain again and % again for the second half of the document. % % If there is another page, we iterate the search. \def\testNextNumberedPage#1{\ifx#1\relax \global\def\NumberedPageCache{\gotNumberedPage0000}% \PackageWarningNoLine{lineno}% {Linenumber reference failed, \MessageBreak rerun to get it right}% \else \global\let\NumberedPageCache#1% \fi \testNumberedPage } % \linelabel{demo2} % \marginpar{\tiny\raggedright % Let's see if it finds the label % on page \pageref{demo}, % line \ref{demo}, and back here % on page \pageref{demo2}, line % \ref{demo2}. % \unskip}% % 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) % \unskip} % % 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 $m$, starting at $f$ %% Numbering modulo 5 % \unskip}\label{ss:Mod} % % 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. % % (New v4.00) Moreover, some users want to % control which linenumber should be printed first. Support of % this is now introduced here.---numline.sty by Michael % Jaegermann and James Fortune offers controlling which % \emph{final} line numbers should not be printed. What is it % good for? We ignore this here until some user demands % it.---Peter Wilson's ledmac.sty offers much different % choices of line numbers to be printed, due to Wayne Sullivan. % (/New v4.00) \newcount\c@linenumbermodulo % (UL) On my question why, e.g., % ~\chardef~ would not have sufficed, Stephan couldn't remember % exactly; guessed that he wanted to offer \LaTeX\ counter % facilities. However, the typical ones don't come this way. % So I'm quite sure that I will change this next time. % % However, I observed at least two times that users gave a very % high value to ~\c@linenumbermodulo~ in order to suppress % printing of the line number. One of these users preferred an % own way of handling line numbers, just wanted to use % ~\linelabel~ and Ednotes features. Should we support this? % I rather would like to advise them to % ~\let\makeLineNumber\relax~. (/UL) % % (New v4.00) ~\themodulolinenumber~ waits for % being declared ~\LineNumber~ by ~\modulolinenumbers~. (This % has been so before, no change.) Here is how it looked % before: % \begin{old}\begin{verbatim} % % \def\themodulolinenumber{{\@tempcnta\c@linenumber % % \divide\@tempcnta\c@linenumbermodulo % % \multiply\@tempcnta\c@linenumbermodulo % % \ifnum\@tempcnta=\c@linenumber\thelinenumber\fi % % }} % \end{verbatim} % \end{old} % (UL) This was somewhat slow. This arithmetic % happens at every line. This time I tend to declare an extra % line counter (as opposed to my usual recommendations to use % counters as rarely as possible) which is stepped every line. % It could be incremented in the same way as ~\n@truepage~ % is incremented via ~\cl@page~! This is another point in favour % of ~{linenumber}~ being a \LaTeX\ counter! % When this new counter equals ~\c@linenumbermodulo~, it is reset, % and ~\thelinenumber~ is executed.---It gets much slower by my % support of controlling the first line number below. I should % improve this.---On %% %% TODO v4.2--pagewise!? % the other hand, time expense means very little nowadays, % while the number of \TeX\ counters still is limited. % % For the same purpose, moreover, attaching the line number % box could be intercepted earlier (in ~\MakeLineNo~), % without changing ~\LineNumber~. However, this may be % bad for the latter's announcement as a wizard interface % in section_\ref{s:UserCmds}. %% %% I wonder about Stephan's group. Its only effect is that %% ~\@tempcnta~ is restored after using it. What for is this? %% I tend to remove the group braces. %% TODO v4.2 % (/UL) % % Here is the new code. It is very near to my lnopatch.sty code % which introduced the first line number feature before.---I % add starting with a ~\relax~ which is so often % recommended---without understanding this really. At least, % it will not harm.---Former group braces appear as % ~\begingroup~/~\endgroup~ here. \def\themodulolinenumber{\relax \ifnum\c@linenumber<\n@firstlinenumber \else \begingroup \@tempcnta\c@linenumber \advance\@tempcnta-\n@firstlinenumber \divide\@tempcnta\c@linenumbermodulo \multiply\@tempcnta\c@linenumbermodulo \advance\@tempcnta\n@firstlinenumber \ifnum\@tempcnta=\c@linenumber \thelinenumber \fi \endgroup \fi } % (/New v4.00) % % The user command to set the modulo counter: %% %% TODO v4.2: \newcommand*...[\z@] \newcommand\modulolinenumbers[1][0]{% \let\LineNumber\themodulolinenumber \ifnum#1>1\relax \c@linenumbermodulo#1\relax \else\ifnum#1=1\relax % \begin{old}\begin{verbatim} % % \def\LineNumber{\thelinenumber}% % \end{verbatim} % \end{old} % (New v4.00) I'm putting something here to enable % ~\firstlinenumber~ with $~\c@linenumbermodulo~=1$. % With lnopatch.sty, a trick was offered for this purpose. % It is now obsolete. % \def\LineNumber{\@LN@ifgreat\thelinenumber}% %% % (/New v4.00) %% \fi\fi } % (New v4.00) The default of ~\@LN@ifgreat~ is \let\@LN@ifgreat\relax % The previous changes as soon as ~\firstlinenumber~ is used: \newcommand*\firstlinenumber[1]{% \chardef\n@firstlinenumber#1\relax %% % No counter, little values allowed only---OK?---(UL) % The change is local---OK? The good thing is that % ~\global\firstlinenumber{~~}~ works. Moreover, % ~\modulolinenumbers~ acts locally as well. (/UL) %% \def\@LN@ifgreat{% \ifnum\c@linenumber<\n@firstlinenumber \expandafter \@gobble \fi }% } % The default is 0. This is best for what one would % expect from modulo printing. \let\n@firstlinenumber=\z@ % % Note that the line numbers of the present section % demonstrate the two devices. (/New v4.00) \setcounter{linenumbermodulo}{5} \modulolinenumbers[1] % % \section{% % Former package extensions % \unskip} %% (New v4.00) %% \begin{old}\begin{verbatim} %% % Package Extensions %% \end{verbatim} %% \end{old} %% Sorry, these are `\emph{former} package extensions'. %% Moreover, these are not ``package options'', %% so install a new section. Move it above ``options''. (/New v4.00) %% Hided 2004/09/19. %% %% TODO remove % % The extensions in this section were previously supplied % in separate ~.sty~ files. %% %% TODO v4.2: `extensions' again ... % % \subsection{% % $display math$ % \unskip} % % 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 % (UL) Indeed. The \LaTeX\ macros are saved for % unnumbered mode, which is detected by ~\linenomath~. % (/UL) % % \subsection{% % Line numbers in internal vertical mode % \unskip} % % 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 % (UL) % This counter appears in ~\internallinenumbers~ only. It seems % to have been meant to be a version of ~\c@linenumber~ which % is changed only \emph{locally}---see ~{internallinenumbers*}~, % where the initialization is local. However, Stephan incremented % it \emph{globally} then, see below. Now, even this global % incrementing would not increment the ~\c@linenumber~ version % \emph{outside} ~{internallinenumbers}~---another reason to % consider ~\c@internallinenumber~ an ``internal version'' of % ~\c@linenumber~. And another reason not to increment it % globally, see below.---A drawback of this kind of ``internal'' % seems to be: ~{internallinenumbers}~ cannot be used to % ``continue line counting in internal vertical mode % temporarily'', exactly because, e.g., ~\c@runninglinenumber~ % has the same value after ~\end{internallinenumbers}~ as it had % at ~\begin{internallinenumbers}~. % (/UL) \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 % (New v4.00) % \begin{old}\begin{verbatim} % % \hbox to\z@{\makeLineNumber}\global\advance\c@linenumber\@ne % \end{verbatim} % \end{old} % followed here previously. Why no ~\stepcounter~? % OK, with unit ~\baselineskip~ there is no space for ``sublines'' % anyway.---More serious: % ~\c@linenumber~ is ~\c@internallinenumber~ here, which in % ~{internallinenumbers*}~has been initialized to be 1---locally! % Save stack problem again. We could use ~\global~ % \emph{depending} on whether the star version is used or not. % However, the ``external'' line counter is not affected anyway, % and the ~\global~ is not needed internally. So just drop it. % I have no idea how a compatibility problem could arise. %% %% TODO v4.2: TEST \hbox to\z@{\makeLineNumber}\advance\c@linenumber\@ne %% % (/New v4.00) %% \advance\c@internallinenumbers\m@ne \expandafter\makeinternalLinenumbers\fi } % % \subsection{% % Line number references with offset % \unskip} % % 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[~~]{~