% NAME THIS FILE: draft.sty (or name it draft.doc and run it through
% doc2sty) AND PUT IT IN YOUR MACROS OR TEXFORMATS DIRECTORY
%
% This is a first attempt at a draft option for the standard LaTeX styles.
% It still has several problems, which are detailed below.
% The draft option attempts to accomplish the following:
%  Without requiring any changes to a LaTeX file (other than specifying
%  the draft option :-) and without changing the formatting of the 
%  ``real'' text , mark the spots where \label, \cite, \ref, \index,
%  or \glossary commands occur in text, and print the command arguments
%  in the margin.
%
% USAGE:
% Specify draft as an optional argument to the documentstyle command
% e.g., \documentstyle[11pt,draft]{book}
%
% JUSTIFICATION:
% Why am I submitting this, even though it still has some problems?
%
%     1) Even in its present shape, I think it is fairly useful.
%        I was going crazy before, trying to remember labels, keys,
%        and so forth.  I am still going crazy, but now for different
%        reasons.
%     2) I'm just learning TeX, and don't expect to know enough to do this
%        correctly for a while.  Hopefully, someone who knows TeX will
%        agree this is a useful option, and will point out my mistakes.
%        Since the changes to the standard LateX routines are fairly minor,
%        and my mistakes are probably silly and quite obvious, this
%        may be easy to do.
%     3) I am interested in hearing ideas for other features for this
%        option.  This option includes some of the ideas of Dr. Rouben 
%        Rostamian (rostamia@umbc3.UMD.EDU) and I am interested in 
%        hearing from others.
%     4) Because of 2) and 3), I think we will end up with a better
%        draft option if I post this in its present form and ask for
%        help.
%
%     Please send bugs, fixes, and suggestions to:
%      Joe Baker 
%      6731 Boelter Hall   UCLA   L.A., CA 90024   (213) 825-7079, 825-2327
%      INTERNET: jbaker@ee.ucla.edu 
%      UUCP: {ucbvax, or other backbone}!ucla-cs!uclaee!jbaker
%
% FINALLY, THE DETAILS
%
% The option marks \label,\cite,\ref,\index, and \glossary commands in the
% text with a scriptsize calligraphic letter in the interline space 
% (L for label,
% C for cite, R for ref, I for index and G for glossary.
% The label, citation, is printed in the margin in scriptsize bold letters.  
%   
% For items which are input in horizontal mode, a \marginpar box holding 
% the text is put in the right margin (if there are no free boxes left, 
% the next option is used.) 
% 
% Items which are input in display math mode are shoved into the left
% margin (parboxes are not used, so it is possible for one label to 
% overwrite another, or for a label to run off the left edge of the page.)
% 
% Items which are input in non-display math mode and equation arrays
% are giving me problems.  The left margin code works fine for equations
% in the middle of text, but doesn't produce anything for equation arrays.
% Unfortunately, I haven't found a way to distinguish between the two
% cases.  For now, I simply raise the item and print it in small letters,
% and hope to avoid hitting any superscripts.
% 
% Right now, a space or extra bit of glue is getting inserted where the 
% item is, and thus the ``real'' text is not formatted quite the same in
% draft mode.  On the tests I've run so far, there hasn't been enough
% added space to actually change any of the linebreaks, so it doesn't
% seem to be a serious problem.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Okay, here it is %%%%%%%%%%%%%%%%%%%%%%%%%%
% NOTE THIS:
% force all marginpar items into the right margin, to leave the left 
% margin for calls to marginalnote.
\@mparswitchfalse
%                     
%
% MARGINALNOTE
%
% The following is a slightly rewritten version of Knuth's marginalstar stuff
% from the TeXBook, pg. 316.  It is used to put a marginalnote in the left
% margin.  The note is just shoved out and made right justified w.r.t. the
% left margin.  Two calls to marginalnote for the same line of text will
% be written one over the other.  Long marginal notes will extend off the
% page to the left.
%
\def\strutdepth{\dp\strutbox}%
\def\marginalnote#1{\strut\vadjust{\kern-\strutdepth\specialnote{#1}}}%
\def\specialnote#1{\vtop to \strutdepth{\baselineskip%
\strutdepth\vss\llap{\hbox{\scriptsize \bf #1}}\null}}%
%
% NOTEMARK
% This is used to put a little calligraphic letter in the text to mark
% the spot where the item occurred.
%
\def\notemark#1{\rlap{%
\specialnote{\raise8pt\hbox{$\scriptscriptstyle\cal#1$}}}}
%
% Since I haven't found one approach that works in all modes, I
% have set up the makenote routine to use the following options
% (draftimm, draftdmm, draftinm, drafthm) in inner math mode,
% display math mode, inner non-math mode, and horizontal mode.
% If you don't like one, redefine it before the begin{document}
% line.
\def\draftimm#1{\hbox{\bf \scriptsize #1}}
\def\draftdmm#1{\marginalnote{#1}}
\def\draftinm#1{\notemark{\bf \scriptsize #1}}
\def\drafthm#1{\ifx\@freelist\@empty % if there are no boxes for a marginpar,
                   \marginalnote{#1}  % use a marginalnote
                 \else                  
                   {\marginpar{\scriptsize \bf #1}}
                 \fi}

%
% MAKENOTE
% this routine prints the command argument.  It tries to do the best it
% can for the given mode.
%
%\def\makenote#1{            
%                            
%                            
%    \ifmmode                % In math mode, we can't use 
%                            % \marginpar, so we use marginalnote
%                            % in display mode, and for now,
%                            % just use bold print in inner mode
%                            % marginalnote works okay in regular
%                            % non-display math, but not in
%                            % eqnarrays. By redefining draft...
%                            % you can change this behavior.
%        \ifinner
%           \draftimm{#1} 
%        \else
%           \draftdmm{#1} 
%        \fi
%    \else
%        \ifinner
%           \draftinm{#1} 
%         \else
%           \drafthm{#1} 
%         \fi
%    \fi}
\def\makenote#1{\ifmmode\ifinner\draftimm{#1}%
\else\draftdmm{#1}\fi%
\else\ifinner\draftinm{#1}%
\else%
\drafthm{#1}%
\fi\fi}
%
% MODIFIED LATEX ROUTINES
% We add the \notemark and \makenote routines to the \ref, \pageref,
% \label, \index, \glossary, and \cite commands.
%
% REF
%
%  \ref{FOO} ==
%    BEGIN
%         make a reference mark in the text (calligraphic R)
%      if \r@foo undefined  
%        then  ?? 
%              Warning: 'reference foo on page ... undefined'
%        else  \@car \eval(\r@FOO)\@nil
%      fi
%        make a reference note (hopefully in the margin) listing the
%        reference key
%    END
%
\def\ref#1{\notemark{R}%
\@ifundefined{r@#1}{{\bf ??}\@warning%
{Reference `#1' on page \thepage \space %
undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter%
\@car\@tempa \@nil\null}\makenote{R:#1}}
%
% PAGEREF
%
%  \pageref{foo} = 
%    BEGIN
%      make a page reference mark in the text (calligraphic PR)
%      if \r@foo undefined  
%        then  ?? 
%              Warning: 'reference foo on page ... undefined'
%        else  \@cdr \eval(\r@FOO)\@nil
%      fi
%      make a reference note (hopefully in the margin) listing the
%      page reference key
%    END
%
\def\pageref#1{\notemark{PR}%
\@ifundefined{r@#1}{{\bf ??}\@warning%
{Reference `#1' on page \thepage \space %
undefined}}{\edef\@tempa{\@nameuse{r@#1}}\expandafter%
\@cdr\@tempa\@nil\null}\makenote{PR:#1}}%
%
% LABEL
%
% same story for the label routine
\def\label#1%
{\notemark{L}\makenote{L:#1}\@bsphack%
\if@filesw{\let\thepage\relax%
\xdef\@gtempa{\write\@auxout{\string%
\newlabel{#1}{{\@currentlabel}{\thepage}}}}}\@gtempa%
\if@nobreak\ifvmode\nobreak\fi\fi\fi\@esphack}
%
% INDEX 
%  note that \@wrindex is normally used by both the index and the 
%  glossary commands.  We will make a new version for the glossary
%  command that differs only in putting out a G instead of an I.
%
%  \@wrindex{ITEM} ==
%    BEGIN
%     make an I mark in the text, and put the index item in the margin
%        write of {\indexentry{ITEM}{page number}}
%      \endgroup
%      \@esphack
%    END
%
\def\@wrindex#1#2{\notemark{I}\makenote{I:#2}%
\let\thepage\relax%
\xdef\@gtempa{\write#1{\string \indexentry{#2}{\thepage}}}\endgroup\@gtempa%
\if@nobreak \ifvmode\nobreak\fi\fi\@esphack}%
%
% GLOSSARY
% version for use by glossary commands
%
\def\@wrindexg#1#2{\notemark{G}\makenote{G:#2}%
\let\thepage\relax%
\xdef\@gtempa{\write#1{\string \indexentry{#2}{\thepage}}}\endgroup\@gtempa%
\if@nobreak \ifvmode\nobreak\fi\fi\@esphack}%
%
% new version of the glossary stuff: just changed @wrindex to @wrindexg
%
\def\makeglossary{\if@filesw \newwrite\@glossaryfile
  \immediate\openout\@glossaryfile=\jobname.glo
  \def\glossary{\@bsphack\begingroup\@sanitize\@wrindexg\@glossaryfile}\typeout
  {Writing glossary file \jobname.glo }\fi}
%
% CITE
%
% citex is used by the bibliography citation routines
% the second argument is the citation key
%
\def\@citex[#1]#2{\notemark{C}\makenote{C:#2}%
\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
\def\@citea{}\@cite{\@for\@citeb:=#2\do%
{\@citea\def\@citea{,}\@ifundefined%
{b@\@citeb}{{\bf ?}\@warning%
{Citation `\@citeb' on page \thepage \space undefined}}%
\hbox{\csname b@\@citeb\endcsname}}}{#1}}

