summaryrefslogtreecommitdiff
path: root/macros/latex209/contrib/misc/altnline.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex209/contrib/misc/altnline.sty')
-rw-r--r--macros/latex209/contrib/misc/altnline.sty189
1 files changed, 189 insertions, 0 deletions
diff --git a/macros/latex209/contrib/misc/altnline.sty b/macros/latex209/contrib/misc/altnline.sty
new file mode 100644
index 0000000000..7ca6e6f281
--- /dev/null
+++ b/macros/latex209/contrib/misc/altnline.sty
@@ -0,0 +1,189 @@
+% altnline.sty Version - 1.1
+%
+% Disclaimer - Use at your own risk.
+%
+% James Fortune
+% Oakland University
+% jafortun@vela.acs.oakland.edu
+%
+% Based upon the TUGboat article ``Output Routines: Examples and Techniques.''
+% that appeared in Volume 11 (1990), Nos. 1, 3 and 4.
+%
+% This version incorporates suggestions made by Michal Jaegermann, namely:
+%
+% * Include explicit reference to the TUGboat article
+% * ``You can use \def in style files without violating LaTeX spirit.
+% If you are writing style it is assumed that you know what you are
+% doing. :-)'' --- I don't know what I'm doing so I left the \newcommand
+% and \renewcommand commands as is.
+% * Internal macros from style file should be protected against name conflicts
+% with user stuff by inclusion of '@' character in names. --- This is quite
+% reasonable so command names that the user is not expected to use in a
+% LaTeX file have been changed to include the '@' character.
+% * He sent a new appendline command that adds numbers on a left margin
+% only that was also inspired by the Salomon article. He left it as an
+% exercise for me to modify it for two-sided printing. I probably shouldn't
+% have picked something from the double dangerous bend signs for my first
+% serious attempt at hacking on a style file :-).
+% * A global linesSoFar so that lineCount may be set to linesSoFar to deal
+% with box255 being broken from the bottom up. countlines (or its
+% equivalent) advances linesSoFar by a count of lines on a current page.
+% * Use of a decremented remainder variable to determine when to add a number
+% to a line. --- I'm trying to get all the lines first.
+% * He advised not trying to combine the countlines and duplicate operations
+% into a single loop. ``I am afraid that you really have to first count
+% how many lines you have on a page and later use this value to produce
+% line numbers.''
+%
+% Changes to version 1.1 - Michal Jaegermann, ntomczak@vega.math.ualberta.ca
+%
+% * Added logic to print line numbers only every \lineCountInterval
+% * Added a way to set up ONE range of numbered lines; use \nlinesBoundary
+% to do that. (It is possible to sprinkle your text with \nlinesBoundary
+% commands and they may even do the right thing if you will put them
+% in right places - but this is a hack.)
+% * Miscellaneous cleanup
+% * Every implicit or explicit \clearpage will still cause
+% 'Output routine didn't use all of \box255' message. Any volunteers
+% who know enough about LaTeX output routine to repair that?
+%
+
+% \font\sevenrm=cmr7
+
+% Rainer showed me how to save the previous \output. Thanks Rainer.
+\newtoks\LaTeX@output
+\LaTeX@output = \expandafter{\the\output}
+
+\newcommand\zero@ToSp{\parskip=\@ne sp plus\@ne pt
+ \renewcommand\vfil{\vskip1sp plus1fil}
+ \renewcommand\vfill{\vskip1sp plus1fill}
+ \abovedisplayshortskip=\@ne sp plus3pt
+ \postdisplaypenalty=\@ne
+ \interlinepenalty=\@ne}
+
+\zero@ToSp
+
+
+\newcount\lin@CountInit % used to establish lineCount of first line on page
+\lin@CountInit=\z@
+\newcount\lineCountInterval % used to determine how often lin@Count is printed
+\lineCountInterval=5
+%
+\newcount\lin@CountStart % don't print line numbers below this value
+\lin@CountStart=\@ne
+\newcount\lin@CountFinish % don't print line numbers higher than this
+\lin@CountFinish=\m@ne
+%
+% A command to set boundaries for line numbering. Use as:
+% \nlinesBoundary{12}, or \nlinesBoundary[50]{12}
+% \nlinesBoundary[<optional upper limit>]<lower limit>
+% Any negative number for an upper limit means number to the very end.
+% This is a default!
+%
+\def\nlinesBoundary{\@ifnextchar[{\nlin@sBoundary}{\nlin@sBoundary[\m@ne]}}
+\edef\nlin@sBoundary[#1]#2{%
+ \global\lin@CountFinish=#1\relax
+ \global\lin@CountStart=#2\relax}
+
+\newif\ifa@@lnum % do we really want to print that line number?
+
+\newcount\lin@sSoFar
+% remainder from division of \lin@sSoFar by \lineCountInterval
+\newcount\total@Rem
+% current value of remainder used to produce line numbers
+\newcount\lin@rem
+% these calculations allow to start with \lin@CountInit different from 0
+\newcommand\resetlin@sSoFar{%
+ \global\lin@sSoFar=\lin@CountInit
+ \total@Rem=\lin@CountInit
+ \divide\total@Rem by\lineCountInterval
+ \multiply\total@Rem by-\lineCountInterval
+ \global\advance\total@Rem by\lin@CountInit}
+
+\resetlin@sSoFar
+
+\newcount\lin@Count
+\newif\ifAnyleft \newcount\pen
+\newcommand\count@lines{%
+ \global\lin@Count=\lin@sSoFar
+ \loop \Anyleftfalse
+ \ifdim\lastskip=\z@ \ifdim\lastkern=\z@ \ifnum\lastpenalty=\z@
+ \setbox0=\lastbox
+ \ifvoid0
+ \else \Anylefttrue \global\advance\lin@Count by\@ne
+ \global\advance\total@Rem by\@ne
+ \ifnum\total@Rem=\lineCountInterval
+ \global\total@Rem=\z@
+ \fi\fi
+ \else \Anylefttrue \unpenalty \fi
+ \else \Anylefttrue \unkern \fi
+ \else \Anylefttrue \unskip \fi
+ \ifAnyleft \repeat}
+
+\newcommand\@duplicate{%
+ \loop \Anyleftfalse
+ \ifdim\lastskip=\z@ \ifdim\lastkern=\z@ \ifnum\lastpenalty=\z@
+ \global\setbox0=\lastbox \ifvoid0 % end of breakup loop
+ \else \Anylefttrue % box present
+ \ifnum\lin@rem=0 % if remainder non-zero we do not care
+ \lin@rem=\lineCountInterval
+ \ifnum\lin@Count<\lin@CountStart
+ \a@@lnumfalse
+ \else
+ \ifnum\lin@CountFinish<0 % no upper bound
+ \a@@lnumtrue % print it
+ \else
+ \ifnum\lin@Count>\lin@CountFinish
+ \a@@lnumfalse
+ \else
+ \a@@lnumtrue % this is the ticket
+ \fi
+ \fi
+ \fi
+ \else
+ \a@@lnumfalse
+ \fi
+ \ifa@@lnum
+ \append@line
+ \else
+ \global\setbox1=\vbox{\box0\unvbox1}
+ \fi
+ \advance\lin@Count\m@ne
+ \advance\lin@rem by\m@ne\fi
+ \else \Anylefttrue % penalty present
+ \pen=\lastpenalty
+ \global\setbox1=\vbox{\penalty\pen\unvbox1}\unpenalty\fi
+ \else \Anylefttrue % kern present
+ \dimen0=\lastkern
+ \global\setbox1=\vbox{\kern\dimen0\unvbox1}\unkern \fi
+ \else \Anylefttrue % skip present
+ \skip0=\lastskip
+ \global\setbox1=\vbox{\vskip\skip0\unvbox1}\unskip \fi
+ \ifAnyleft \repeat}
+
+\newcommand\append@line{% attach line number
+ \setbox2=\vbox to \z@{\smash{\footnotesize\the\lin@Count}}
+ \wd2=25pt % that much of space for a line number
+ \ifodd\count0 % on the right margin for odd pages
+ \setbox0=\hbox{\box0\rlap{\rule{\wd2}{\z@}\box2}}
+ \else % and on the left for even
+ \setbox0=\hbox{\llap{\box2}\box0}
+ \fi
+ \global\setbox1=\vbox{\box0\unvbox1}} % add this to a reconstructed page
+
+\newbox\brk % Use old output definition if page is not to be output
+\output={\ifnum\outputpenalty <-\@M
+ \output={\LaTeX@output}
+\else
+ \lin@Count=\lin@sSoFar
+ \setbox\brk=\vbox{\unvcopy\@cclv\count@lines}
+ \global\setbox1=\vbox{}
+ \lin@rem=\total@Rem
+ \global\lin@sSoFar=\lin@Count
+ \setbox\brk=\vbox{\unvcopy\@cclv\@duplicate}
+ \ifdim\ht\brk>\z@\message{Incomplete breakup}\fi
+ \ht1=\z@\dp1=\z@
+ \global\setbox\@cclv=\vbox to\vsize{\unvbox1}% attempt to get glues back
+ \@makecol\@opcol
+\fi}
+\endinput