%%% backgrnd.sty = background.sty
%%% Experimental version 24 march 1996
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%%   This macro file aims at implementing marking of text,
%%%   either by a grey background or by a change bar
%%%   using TeX's own resoureces only,
%%%   (i.e., without resorting to any pstricks).
%%%   Grey background uses a shade font defined using MetaFont
%%% The macros seem to work satisfactory under plain TeX,
%%%   however, I have also tried (rudimentarily) to integrate it with
%%%   LaTeX, too. It seems to work with (simple) LaTeX 2.09, at least.
%%%
%%% commands :
%%%     \RuleOn  and \RuleOff  : changebar
%%%     \RuleON                : backs up to mark current line, too
%%%     \RuleStyle { ( dimension )          % width of rule
%%%                                         % rule offset on pages
%%%                  [ # dimension |        %      with even pagenumbers
%%%                    # dimension ] }      %      with odd pagenumbers
%%%                                         % # is either < : left margin
%%%                                         %          or > : right margin
%%%     e.g.: default values are set by
%%%           \RuleStyle { (2pt)[<18pt|>18pt] }
%%%
%%%
%%%     \ShadeON               ( backs up to mark current line, too ) and
%%%     \ShadeOn and \ShadeOff : grey background, requires shade.sty
%%%                              therefore, by default,
    \let\ifUseGrey\iffalse     % grey background will not be installed
%%%                              - and will be replaced by rules
%%%                              if grey background is required then
%%%                              remove comment signs %%% from next line :
%%% \let\ifUseGrey\iftrue
%%%
%%%            (At present) it is not possible to use both commands
%%%            in the same document !
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%  Peter Schmitt                                  %%%
%%%  Institut f\"ur Mathematik, Universit\"at Wien  %%%
%%%  Strudlhofgasse 4, A-1090 Wien, Austria         %%%
%%%  email: schmitt@awirap.bitnet                   %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\catcode`\: 11                                  % make internal macros private
\countdef\int: 255                              % scratch registers
\dimendef\dim: 0
\skipdef\skip: 0

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%   commands and options   %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def \RuleOn {\bg:ini \bg:rule
              \RuleStyle { (2pt)[<18pt|>18pt] }
              \bg:commands \RuleOn \RuleON \RuleOff
              \RuleOn
             }
\def \RuleStyle #1{\set:hsize #1(\bg:hsize)\\%
                   \set:offsets #1[*|*]\iftrue]\iffalse\\%
                  }

\def \bg:rule   {\leaders\vrule width\bg:hsize\vskip}
\def \bg:empty  {\vskip}
\let \bg:offset \relax

%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%   interface tools   %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def\bg:commands #1#2#3{\def #1{\bg:option {\vbox{}\pos:on}}
                        \def #2{\bg:option {\nobreak\vskip-\baselineskip
                                \vbox{}\pos:on
                                \nobreak\vskip\baselineskip }
                               }
                        \def #3{\bg:option {\vbox{}\pos:off}}
                       }
\def \bg:ini {\output{\bg:output}     % should be followed by desired \bg:style
              \zero:pos
              \global\let \bg:skip \bg:empty
              \let \bg:style
             }
\def\bg:option #1{\ifvmode #1\else \vadjust{#1}\fi }

\def \set:hsize  #1(#2)#3\\{\edef\bg:hsize{#2}}
\def \set:offsets #1[#2#3|#4#5]#6]#7#8\\{#7
     \def\bg:shift{}
     \set:offset #2#3
     \set:offset #4#5
     \expandafter \set:shifts \bg:shift
                                         \fi }
\def\set:offset #1#2 {\setbox0\hbox{\dim:
#2\bg:offset\xdef\bg:offset{\the\dim:}}
                      \dim:\bg:offset
                      \expandafter\expandafter\expandafter
                          \set:shift \csname bg:#1\endcsname
                     }
\def\set:shift #1#2{\dim: \bg:offset \advance\dim: #2%
                    \edef\bg:shift {\bg:shift {#1\the\dim:}}
                   }
\expandafter\def \csname bg:<\endcsname {\moveleft \bg:hsize}
\expandafter\def \csname bg:>\endcsname {\moveright \hsize}
\def \set:shifts #1#2{\def\bg:shift{\ifodd\pageno #2\else #1\fi}}

%%% not used :
\def\bg:err #1{\errmessage {%
               Warning ! Background mode \noexpand#1 already active ! }
              }
%%% saving position without eject yields not always correct result
%%% \def\bg:on  {\switch:to \bg:style } \def\bg:off {\switch:to \bg:empty }

%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%   grey background   %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ifUseGrey

\def\ShadeOn {\bg:ini \bg:grey
              \let\bg:shift\relax
              \let\bg:hsize\hsize
              \setbox\grey:line
                 \vbox{\shade{\line:{\vphantom{\grey:\char0}\hfil}}}
              \bg:commands \ShadeOn \ShadeON \ShadeOff
              \ShadeOn
             }
\csname newbox\endcsname\grey:line         % allow \newbox in conditional text
\def\bg:grey {\leaders\copy\grey:line\vskip}
\let\line:\line
\input shade

\else
  \def\ShadeOn{\RuleOn} \def\ShadeOff{\RuleOff} \def\ShadeON{\RuleON}
  \fi
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%   output routine   %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%

   \newbox \bg:page
 \newdimen \v:size
  \newskip \v:pos
 \newcount \true:penalty
  \chardef \the:page 255

\def\option: #1{\advance\int: -1
                \edef#1{\penalty\the\int: }
                \expandafter\def\csname\the\int:\endcsname
               } \int: -12345
\def\bg:output{\expandafter\ifx\csname\the\outputpenalty\endcsname\relax
                     \global\true:penalty\outputpenalty
                     \expandafter\bg:pagecontents
               \else \expandafter\expandafter
                     \csname\the\outputpenalty\endcsname
               \fi }
\option: \pos:on  {\bg:switch \bg:style }
\option: \pos:off {\bg:switch \bg:empty }
\option:  \bg:top {\save:pos \add:bg\bg:empty\v:skip{}
                   \repeat:page \unvbox\the:page }
\option:  \bg:bot {\save:pos \repeat:page \unvbox\the:page }
\option:  \fg:end {\save:pos \add:bg\bg:empty{}\v:skip \bg:makepage }

\def \bg:switch #1{\setbox\the:page
                          \vbox{\unvbox\the:page \setbox0\lastbox }
                   \ifdim \pagetotal=\topskip
                          \global\let \bg:skip #1
                          \unvbox\the:page
                    \else \switch:to #1
                          \repeat:page\repeat:inserts \unvbox\the:page
                      \fi
                  }
\def\switch:to #1{\save:pos
                  \add:bg \bg:skip{}\v:skip
                  \global\let \bg:skip #1}
\def\bg:pagecontents {\switch:to \bg:skip
                      \setbox\the:page \vbox
                          {\vbox{}\bg:top \unvbox\the:page \bg:bot }
                      \zero:pos \repeat:page
                      \pagecontents \fg:end
                     }
\def\bg:makepage {\global\v:size\vsize \advance\v:size \dp\the:page
                  \def\pagecontents{%
                        \bg:shift
                        \vbox to0pt{\vbox to\v:size{\unvbox\bg:page}\vss}
                        \unvbox\the:page }
                  \outputpenalty\true:penalty
                  \plainoutput
                  \zero:pos \reset:inserts
                 }

%%%%%%%%%%%%%%%%%
%%%   tools   %%%
%%%%%%%%%%%%%%%%%

\def\repeat:page {\vbox{}\nobreak\kern-\topskip }
\def\add:bg #1#2#3{\let\bg:vskip #1
                   \global\setbox\bg:page \vbox{#2\unvbox\bg:page#3}
                  }

\newdimen \v:fil
\newdimen \v:fill
\newdimen \v:filll
\def\zero:pos {\global   \v:pos 0pt
               \global   \v:fil 0pt
               \global  \v:fill 0pt
               \global \v:filll 0pt
              }
\def\save:pos {\skip: -\v:pos                            % save -last:pos
               \global         \v:pos \pagetotal
               \global\advance \v:pos \pagedepth
                      \ifnum \pagedepth=0 \advance\v:pos \dp\the:page \fi
               \global\advance \v:pos 0ptplus\pagestretch minus\pageshrink
               \save:skip
              }
\def\save:pos {\skip: -\v:pos                            % save -last:pos
               \global         \v:pos \pagetotal
               \global\advance \v:pos \pagedepth
                      \ifnum \pagedepth=0 \advance\v:pos \dp\the:page \fi
               \global\advance \v:pos 0ptplus\pagestretch minus\pageshrink
               \save:skip
               \global\skip\ins:size \vsize
                      \global\advance\skip\ins:size -\pagegoal
                      \global\advance\skip\ins:size -\ins:skip
              }
\def\save:skip {\advance\skip:\v:pos                     % v:pos - last:pos
                \let\bg:vskip\relax
                \edef\v:skip{\bg:vskip\the\skip:}
                \fil:skip l \fil:skip ll \fil:skip lll
               }
\def\fil:skip #1 {\set:fil {\csname v:fi#1\endcsname}
                           {\csname pagefi#1stretch\endcsname}
                  \edef\v:skip{\v:skip \bg:vskip0ptplus\the:pt \dim: fi#1 }
                 }
\def\set:fil #1#2{\dim: -#1
                  \advance \dim: #2
                  \global #1 #2
                 }
\def\the:pt {\expandafter\PT:\the}
                     {  \catcode`p 12 \catcode`t 12
\gdef\PT: #1pt{#1}   }% \catcode`p 11 \catcode`t 11

%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%   insert handling   %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcount\ins:
\newinsert\ins:size
\newdimen\ins:skip

\let\do:insert \insert
\def\inserts:{}
\def\insert {\afterassignment\adjust:pos\ins:}
\def\adjust:pos {\csname ins:\the\ins:\endcsname\csname iftrue\endcsname
                 \add:plus \ins: \add:minus \ins:
                 \advance\ins:skip\skip\ins:
                 \let\temp:\relax
                 \edef\inserts:{\inserts: \temp:{\the\ins:}}
                 \fi
                 \global\expandafter\let\csname ins:\the\ins:\endcsname \iffalse
                 \do:insert\ins: }
\def\repeat:inserts{\def\temp:##1{\do:insert##1{}}\inserts: }
\def\reset:inserts{%
    \def\temp: ##1{\global\expandafter\let\csname ins:##1\endcsname \relax }
    \inserts: \gdef\inserts:{}\global\ins:skip 0pt }

%%%   tools for insert handling   %%%

    \catcode `L12 \catcode `N12 \catcode `S12 \catcode `U12 \lowercase{
\def\plus: #1LUS #2 #3\\{#2}
\def\Plus: #1{\expandafter\plus:\the#1 LUS 0.0pt \\}
\def\minus: #1NUS #2 #3\\{#2}
\def\Minus: #1{\expandafter\minus:\the#1 NUS 0.0pt \\}
    } \catcode `L11 \catcode `N11 \catcode `S11 \catcode `U11

\def\set:int {\afterassignment\set:frac\int: }
\def\set:frac #1{\afterassignment\csname\count0 }
\def\adv:pos #1{\global\advance#1\the\int:.\the\count0 pt }
\def   \pt:p {\adv:pos {\v:pos 0ptplus}}
\def   \pt:m {\adv:pos {\v:pos 0ptminus}}
\def  \fil:p {\adv:pos \v:fil }
\def \fill:p {\adv:pos \v:fill }
\def\filll:p {\adv:pos \v:filll }

\def\add:plus  #1{{\expandafter\set:int \Plus: {\skip#1}:p\endcsname }}
\def\add:minus #1{{\expandafter\set:int \Minus:{\skip#1}:m\endcsname }}

%%%%%%%%%%%%%%%%%%%%%%%%
%%%   LaTeX extras   %%%
%%%%%%%%%%%%%%%%%%%%%%%%

\catcode`@ 11
\ifx \@outputbox\undefined \endinput \catcode`@12 \catcode`: 12 \fi

\newtoks\latex:output \latex:output \output
\newdimen\v:ht                             % possibly \textheight could be used

\def\bg:@makecol {\switch:to \bg:skip
                  \setbox\the:page \vbox
                      {\vbox{}\bg:top \unvbox\the:page \bg:bot }
                  \@makecol
                  \global\v:ht\ht\@outputbox \global\v:size\v:ht
                              \global\advance\v:size\dp\@outputbox
                  \zero:pos \outputpenalty\true:penalty
                  \repeat:page \unvbox\@outputbox \fg:end
                 }
\def\bg:@makepage {\setbox\@outputbox \vbox to \v:ht {%
                       \bg:shift
                       \vbox to0pt{\vbox to\v:size{\unvbox\bg:page}\vss}
                       \unvbox\the:page }
                   \outputpenalty\true:penalty
                   \let\@makecol\relax \the\latex:output
                   \zero:pos \reset:inserts
                  }
\let \bg:makepage \bg:@makepage
\let \bg:pagecontents \bg:@makecol
\def \line: {\hbox to\textwidth}
\let \pageno \c@page

\catcode`@ 12 \catcode`: 12

\endinput %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%   end : background.sty  [ 0.3 ]   %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
