%%%%
%% code.sty : LaTex environment for verbatim program code displays
%%
%% George Ferguson, ferguson@cs.rochester.edu, 3 Jul 1991.
%%
%% Requires Rainer Sch\"opf's (SCHOEPF@SC.ZIB-Berlin.DE) verbatim
%% style option. Based on a suggestion by Bernd Raichle
%% (raichle@azu.informatik.uni-stuttgart.de).
%%
%% Uses LaTeX iteration macro @tfor to process arguments to code
%% environment.
%%
\typeout{Style-option: `code' (George Ferguson)}
\input{/u/ferguson/lib/tex/verbatim.sty}

%%
%% Miscellaneous stuff so we could easily `let' things.
%%
\def\gf@flushleft#1{\noindent#1\hfill}
\def\gf@flushright#1{\hfill\relax#1}
\def\gf@indented#1{\par\hskip\parskip#1\hfill}
\def\gf@noop#1{#1}

%%
%% The code environment formats the text between \begin{code}{opts}
%% \end{code} in verbatim mode. The box containing the code is only as
%% wide as its longest line. The `opts' are interpreted as follows:
%%    c : center the block of code
%%    l : make the block of code flush to the left margin
%%    r : make the block of code flush to the right margin
%%    i : indent the block of code (by \parskip) from the left
%%    f : draw a frame around the block of code
%%    t : make the resulting box have its baseline at the top
%%    b : make the resulting box have its baseline at the bottom
%% Any combination and order of options is acceptable, but only the last
%% of {c,l,r,i} and {t,b} will have horizontal and vertical effect,
%% respectively.
%% The default is to produce a flush-left, bottom-aligned block of code.
%%   
\newenvironment{code}[1]{%
  % redefine `processline' to produce only a line as wide
  % as the natural width of the line
  \def\verbatim@processline{%
    {\setbox0=\hbox{\the\verbatim@line}%
    \hsize=\wd0 \the\verbatim@line\par}}%
  % set finishing ``mode''
  \global\let\gf@hadjust\hbox
  \global\let\gf@vadjust\vbox
  \global\let\gf@frame\gf@noop
  \@tfor \gf@char :=#1\do
    {\if\gf@char c\global\let\gf@hadjust\centerline\fi
     \if\gf@char l\global\let\gf@hadjust\gf@flushleft\fi
     \if\gf@char r\global\let\gf@hadjust\gf@flushright\fi
     \if\gf@char i\global\let\gf@hadjust\gf@indented\fi
     \if\gf@char t\global\let\gf@vadjust\vtop\fi
     \if\gf@char b\global\let\gf@vadjust\vbox\fi
     \if\gf@char f\global\let\gf@frame\frame\fi
    }
  % save the verbatim code in a box
  \setbox0=\gf@vadjust\bgroup \verbatim
}{%
  \endverbatim
  \egroup % close the box and `box' it appropriately
  \gf@hadjust{\gf@frame{\box0}}
}
