% Change bar document-style option for LaTeX.
%
% Copyright (C) 1990 by David B. Johnson.
%
% dbj@titan.rice.edu (Dave Johnson)

% These macros draw a solid bar down the right margin of the output,
% covering a range of the input file that has been declared to be changed.
%
% The beginning and end of a change bar in the text are marked with
% \chgbarbegin and \chgbarend, respectively.  For example,
%
%     Here is some sample text \chgbarbegin that was
%     changed\chgbarend{} and some that wasn't changed.
%
% The change bar is drawn continuously between the line of output
% containing the \chgbarbegin and the line of output containing the
% \chgbarend.  These lines can end up on separate pages, and the
% division at page boundaries is handled automatically.

% Two dimensions control the size and placement of the change bars:
%     \chgbarwidth      The width of a change bar
%     \chgbarsep        The distance between the text and the change bar

% Warning: it does not appear to be possible to do this completely
% correctly, due to the time at which the verticle glue on a page is
% finally set, and the way that page breaks are decided.  With
% \raggedbottom, this normally works fine.  It hasn't been tested with
% \flushbottom, but will probably behave worse.  In strange rare 
% situations, a change bar might be drawn from the first line of a page
% up off the top of a page; this can usually be fixed by slightly moving
% the \chngbarend around, or by breaking a single change bar range
% into two ranges.

\newdimen\chgbarwidth \newdimen\chgbarsep
\chgbarwidth 4pt
\chgbarsep .25in

\def\chgbarbegin{\ifhmode\@chgbar{-2}\else\@chgbar{-3}\fi}
\def\chgbarend{\@chgbar{-4}\relax}

\marginparpush 0pt

% The remainder of this is hacked up based on the LaTeX 2.09 latex.tex.

% copied from \marginpar
\def\@chgbar#1{\ifhmode \@bsphack\@floatpenalty -\@Mii\else
   \@floatpenalty-\@Miii\fi\ifinner
      \@parmoderr\@floatpenalty\z@
    \else\@next\@currbox\@freelist{\global
      \count\@currbox#1}{\@floatpenalty\z@ \@fltovf
      \def\@currbox{\@tempboxa}}\fi
     \setbox\@tempboxa\vbox
     \bgroup\end@float\@esphack}

\newdimen\@chgbarbegin
\newif\if@inchgbar \@inchgbarfalse

\def\@addmarginpar{%
\ifnum\count\@currbox = -2	% change bar begin from hmode
    \global\@chgbarbegin\@pageht \global\advance\@chgbarbegin -\baselineskip
    \global\@inchgbartrue
    \@cons\@freelist\@currbox
\else
\ifnum\count\@currbox = -3	% change bar begin not from hmode
    \global\@chgbarbegin\@pageht
    \global\@inchgbartrue
    \@cons\@freelist\@currbox
\else
\ifnum\count\@currbox = -4	% change bar end
    \if@inchgbar\else\@latexbug\fi
    \@tempdima\@pageht \advance\@tempdima -\@chgbarbegin
    \nointerlineskip
    \@tempcnta\@ne
    \if@twocolumn 
        \if@firstcolumn \@tempcnta\m@ne \fi
    \else 
      \if@mparswitch
         \ifodd\c@page \else\@tempcnta\m@ne \fi
      \fi
      \if@reversemargin \@tempcnta -\@tempcnta \fi
    \fi
    \hbox to\columnwidth
      {\ifnum \@tempcnta >\z@
          \hskip\columnwidth \hskip\chgbarsep
        \else \hskip -\chgbarsep \fi
\hbox{\vbox to 0pt{\vss
       \hrule \@height\@tempdima \@width\chgbarwidth \@depth\z@
}}
\hss}
    \nointerlineskip
    \global\@inchgbarfalse
    \@cons\@freelist\@currbox
\else
    \@next\@marbox\@currlist{\@cons\@freelist\@marbox
    \@cons\@freelist\@currbox}\@latexbug\@tempcnta\@ne
    \if@twocolumn 
        \if@firstcolumn \@tempcnta\m@ne \fi
    \else 
      \if@mparswitch
         \ifodd\c@page \else\@tempcnta\m@ne \fi
      \fi
      \if@reversemargin \@tempcnta -\@tempcnta \fi
    \fi
    \ifnum\@tempcnta <\z@  \global\setbox\@marbox\box\@currbox \fi
    \@tempdima\@mparbottom \advance\@tempdima -\@pageht 
       \advance\@tempdima\ht\@marbox \ifdim\@tempdima >\z@
       \@warning{Marginpar on page \thepage\space moved}\else\@tempdima\z@ \fi
    \global\@mparbottom\@pageht \global\advance\@mparbottom\@tempdima
       \global\advance\@mparbottom\dp\@marbox
       \global\advance\@mparbottom\marginparpush
    \advance\@tempdima -\ht\@marbox
    \global\ht\@marbox\z@ \global\dp\@marbox\z@ 
    \vskip -\@pagedp \vskip\@tempdima\nointerlineskip 
    \hbox to\columnwidth
      {\ifnum \@tempcnta >\z@
          \hskip\columnwidth \hskip\marginparsep
        \else \hskip -\marginparsep \hskip -\marginparwidth \fi
       \box\@marbox \hss}
    \vskip -\@tempdima
    \nointerlineskip
    \hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}
\fi\fi\fi}

\def\@makecol{\setbox\@outputbox\box\@cclv
   \if@inchgbar
    \@tempcnta\@ne
    \if@twocolumn 
        \if@firstcolumn \@tempcnta\m@ne \fi
    \else 
      \if@mparswitch
         \ifodd\c@page \else\@tempcnta\m@ne \fi
      \fi
      \if@reversemargin \@tempcnta -\@tempcnta \fi
    \fi
    \@tempdima\ht\@outputbox \advance\@tempdima -\@chgbarbegin
    \advance\@tempdima -\baselineskip
    \setbox\@outputbox
     \vbox{\boxmaxdepth \maxdepth
     \unvbox\@outputbox \nointerlineskip \hbox to\columnwidth
      {\ifnum \@tempcnta >\z@
          \hskip\columnwidth \hskip\chgbarsep
        \else \hskip -\chgbarsep \fi
       \hbox{\vbox to 0pt{\vss
         \hrule \@height\@tempdima \@width\chgbarwidth \@depth\z@}}\hss}}
    \global\@chgbarbegin 0pt
\fi
   \ifvoid\footins\else\setbox\@outputbox
     \vbox{\boxmaxdepth \maxdepth
     \unvbox\@outputbox\vskip\skip\footins\footnoterule\unvbox\footins}\fi
     \xdef\@freelist{\@freelist\@midlist}\gdef\@midlist{}\@combinefloats
     \setbox\@outputbox\vbox to\@colht{\boxmaxdepth\maxdepth
        \@texttop\dimen128=\dp\@outputbox\unvbox\@outputbox
        \vskip-\dimen128\@textbottom}
     \global\maxdepth\@maxdepth}

\newenvironment{changebar}{\chgbarbegin}{\chgbarend}
