summaryrefslogtreecommitdiffstats
path: root/doc/implement/changebar.sty
blob: 61b7383f9f534ff928af6050b8daba632db347ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
% Change bar document-style option for LaTeX.
%
% Copyright (C) 1990 by David B. 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}