<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% Psfig/TeX
\def\PsfigVersion{1.10}%
\def\setDriver{\TexturesDriver}%
% \DvipsDriver, \DOSDriver, \OzTeXDriver, or \TexturesDriver
%
% All software, documentation, and related files in this distribution of
% psfig/tex are Copyright 1993 Trevor J. Darrell
%
% Permission is granted for use and non-profit distribution of psfig/tex
% providing that this notice is clearly maintained. The right to
% distribute any portion of psfig/tex for profit or as part of any commercial
% product is specifically reserved for the author(s) of that portion.
%
% To use with LaTeX, use \documentstyle[psfig,...]{...}%
% To use with TeX, use \input psfig.sty
%
% Bugs and improvements to trevor@media.mit.edu.
%
% Thanks to Ned Batchelder, Greg Hager (GDH), J. Daniel Smith (JDS),
% Tom Rokicki (TR), Robert Russell (RR), George V. Reilly (GVR),
% Ken McGlothlen (KHC), Baron Grey (BG), Gerhard Tobermann (GT).
% and all others who have contributed code and comments to this project!
%
% ======================================================================
% Modification History:
%
%  9 Oct 1990   JDS	used more robust bbox reading code from Tom Rokicki
% 29 Mar 1991   JDS	implemented rotation= option
% 25 Jun 1991   RR	if bb specified on cmd line don't check
%			for .ps file.
%  3 Jul 1991	JDS	check if file already read in once
%  4 Sep 1991	JDS	fixed incorrect computation of rotated
%			bounding box
% 25 Sep 1991	GVR	expanded synopsis of \psfig
% 14 Oct 1991	JDS	\fbox code from LaTeX so \psdraft works with Plain TeX
%			changed \typeout to \ps@typeout
% 17 Oct 1991	JDS	added \psscalefirst and \psrotatefirst
% 23 Jun 1993   KHC     ``doclip'' must appear before ``rotate''
% 27 Oct 1993   TJD	removed printing of filename to avoid
%			underscore problems. changed \frame to \fbox.
%			Added OzTeX support from BG. Added new
%			figure search path code from GT.
% 18 Mar 1994   AO:  
% . Added support for Textures(1.6.2). Later versions may work with PSfig
%   even better. Screen preview is way wrong now, but that's the price we 
%   had to pay.
% . Removed spurious \space tokens from these macro definitions and from 
%   this file.
% . Added stroke= option to stroke the bounding box instead of
%   clip it (useful for gauging llx, etc. options.
%   Required change to special.pro in order to work with dvips, etc.
% . Modularized the differences in filesystems.
% . Extensive revisions to psfig-doc.tex.
% ! Here's an idea: allow the \psfig command to locally set all the
%   options that are controlled by, e.g., \psdraft/\psfull.
%   And vice versa: define, e.g., a \psclip command that says 
%   figures will clip by default.
%   A lot of work. Maybe 'twould be better to just have a mode
%   for the \psfig command that would set the relevant parms
%   (perhaps: \psfig without any figure= option).
%   AO is Arthur Ogawa (ogawa@teleport.com)
% 19 Apr 1994   AO:  
%  .Fixed bug whereby if file was found in the current directory, 
%   the macro incorrectly thought it had not been found. 
%   Thanks, becky@bluesky.com!
% 24 Feb 1995   AO:
%   Revised for Textures 1.7's new \specials and new TeXdict.
%   Added preview= option: User sees a scren preview of the graphic only 
%   if the option is specifically requested. Textures does not completely 
%   support screen preview at this time: the graphic will not appear in the
%   correct position or orientation on screen.
%
% ======================================================================
%
% Command synopsis:
%
% \psdraft	draws an outline box, but doesn't include the figure
%		in the DVI file.  Useful for previewing.
%
% \psfull	includes the figure in the DVI file (default).
%
% \psscalefirst width= or height= specifies the size of the figure
% 		before rotation.
% \psrotatefirst (default) width= or height= specifies the size of the
% 		 figure after rotation.  Asymetric figures will
% 		 appear to shrink.
%
% \psfigurepath{dir:dir:...}%  sets the path to search for the figure
%
%AO - Note: With Textures, separator is `;', instead of `:' so you can
%  put real Mac paths in. Thus:
%
% \psfigurepath{:;vol:folder;:folder:subfolder;::parent:child}%
%
% are some examples of folder sequences you can combine into a path.
%
% \psfig
% usage: \psfig{file=, figure=, height=, width=,
%			bbllx=, bblly=, bburx=, bbury=,
%			rheight=, rwidth=, clip=, angle=, silent=}%
%
%	"file" is the filename.  If no path name is specified and the
%		file is not found in the current directory,
%		it will be looked for in directory \psfigurepath.
%	"figure" is a synonym for "file".
%	By default, the width and height of the figure are taken from
%		the BoundingBox of the figure.
%	If "width" is specified, the figure is scaled so that it has
%		the specified width.  Its height changes proportionately.
%	If "height" is specified, the figure is scaled so that it has
%		the specified height.  Its width changes proportionately.
%	If both "width" and "height" are specified, the figure is scaled
%		anamorphically.
%	"bbllx", "bblly", "bburx", and "bbury" control the PostScript
%		BoundingBox.  If these four values are specified
%               *before* the "file" option, the PSFIG will not try to
%               open the PostScript file.
%	"rheight" and "rwidth" are the reserved height and width
%		of the figure, i.e., how big TeX actually thinks
%		the figure is.  They default to "width" and "height".
%	The "clip" option ensures that no portion of the figure will
%		appear outside its BoundingBox.  "clip=" is a switch and
%		takes no value, but the `=' must be present.
%	The "angle" option specifies the angle of rotation (degrees, ccw).
%	The "silent" option makes \psfig work silently.
%
% ======================================================================
% check to see if macros already loaded in (maybe some other file says
% "\input psfig") ...
\ifx\undefined\psfig\else\endinput\fi
%
% from a suggestion by eijkhout@csrd.uiuc.edu to allow
% loading as a style file. Changed to avoid problems
% with amstex per suggestion by jbence@math.ucla.edu

\let\LaTeXAtSign=\@
\let\@=\relax
\edef\psfigRestoreAt{\catcode`\@=\number\catcode`@\relax}%
%\edef\psfigRestoreAt{\catcode`@=\number\catcode`@\relax}%
\catcode`\@=11\relax
\newwrite\@unused
\def\ps@typeout#1{{\let\protect\string\immediate\write\@unused{#1}}}%

\def\DvipsDriver{%
	\ps@typeout{psfig/tex \PsfigVersion -dvips}%
 \def\@p@sspecials{\DvipsSpecials}%
	\def\@p@sdir{/}%
	\def\@p@ssep{:}%
 \@p@smakePaths
 %AO - I think the following had been in error; s/b `.', not `./'
 \psfigurepath{.}%
}%
\def\OzTeXDriver{%
	\ps@typeout{psfig/tex \PsfigVersion -oztex}%
	\def\@p@sspecials{\OzTeXSpecials}%
 %AO - changed OzTeX's parsing, because it had been very wrong
	\def\@p@sdir{:}%
	\def\@p@ssep{;}%
 \@p@smakePaths
 \psfigurepath{}% default
	\catcode`\^^J=5\relax
}%
%AO - driver for Textures
\def\TexturesDriver{%
	\ps@typeout{psfig/tex \PsfigVersion -Textures}%
	\def\@p@sspecials{\TexturesSpecials}%
	\def\@p@sdir{:}%
	\def\@p@ssep{;}%
 \@p@smakePaths
 \psfigurepath{}% default is the PMSP (DOC folder, APP folder, TeX inputs folder, SYS folder)
	\catcode`\^^J=5\relax
 % Textures dvi translator does something when it finds the bounding box,
 % so we must compensate for this: we have to know the same bounding box info.
 \@bb@alwaystrue
  % Entries for PSFig dict.
  % Note that the following operators are the same as (or differ only slightly from)
  % those in dvips's special.pro (I've only disabled some dvips-specific features)
  % unless otherwise noted:
  % N B S X TR normalscale psfts startTexFig doclip endTexFig 
  \special{prepostscript
   /PSFig 50 dict dup userdict 4 2 roll put begin
   }%
  \special{prepostscript
   /N {def}def /B {bind def} N /S {exch} N /X {S N} B /TR {translate} N
   %AO - Klootches! Dummy definitions for unsupported operators
   % No support for PS output from manky print drivers like LW7 and earlier. 
   % Please use the LaserWriter 8 driver instead!
   /@MacSetUp{}N
   % DVImag default
   /DVImag{1}N
   /magscale false N
   % Supply dummy values for the resolution
   /Resolution{72}N 
   /VResolution{72}N
   %AO - end Klootches 8-}
   /normalscale{
    Resolution 72 div VResolution 72 div neg scale 
    magscale{ DVImag dup scale}if 
    0 setgray
    }N 
   /psfts{
    S 65781.76 div N
    }N
   }%
  \special{prepostscript
   /startTexFig{
    % width height bbllx bblly bburx bbury startTexFig -
    % Textures already saves the state
    %/psf$SavedState save N
    % normalscale currentpoint TR
    /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts 
    /psf$y   psfts /psf$x   psfts 
    %currentpoint /psf$cy X /psf$cx X 
    %/psf$sx psf$x psf$urx psf$llx sub div N 
    %/psf$sy psf$y psf$ury psf$lly sub div N 
    %psf$sx psf$sy scale 
    %psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
    psf$llx neg psf$ury neg TR
    userdict begin /showpage{}N /erasepage{}N /copypage{}N /initclip{}N
    /p 3 def 
    @MacSetUp
    }N 
   }%
  \special{prepostscript
   /endTexFig{
    % begin is in startTexFig; it is ended by Textures
    % end
    % psf$SavedState restore
    }N 
   }%
  \special{prepostscript
   /doclip{
    psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll 
    newpath 
    4 copy 4 2 roll moveto 
    % psf$cx psf$cy psf$llx psf$lly psf$urx psf$ury psf$urx psf$ury
    6 -1 roll S lineto S lineto S lineto closepath 
    % execute clip-stroke instead of clip
    clip-stroke newpath
    % psf$cx psf$cy 
    moveto
    }N 
   }%
  \special{prepostscript
   /dostroke{
    gsave 
     % stroke width will be .5 bp
     0 .353 dup itransform 3 -1 roll dup itransform 3 -1 roll sub dup mul exch 3 -1 roll sub dup mul add sqrt
     setlinewidth 
     stroke 
     grestore 
    }N 
   }%
  % provide default definition
  \special{prepostscript
   /clip-stroke {} N
   }%
  % Note that sps- and eps- definitions serve as variants: 
  % Textures always says "sps" ahead of and "end eps" after the illustration or postscriptfile
  % The -prolog variants are for use with prolog= and postlog= options.
  % These definitions just move to the current point.
  \special{prepostscript 
   /sps-prolog {translate 72.27 72 div mul2 neg scale newpath 0 0 moveto currentdict begin} N
   /eps-prolog {} N
   }%
  \special{prepostscript
   /sps-import {%
    % angle spwidth spheight spllx splly spurx spury sx sy cx cy sps -
    translate 72.27 72 div mul2 neg scale newpath 0 0 moveto
    %72.27 72 div dup [/VResolution /Resolution] {dup load exec 3 -1 roll mul store} forall
    % angle spwidth spheight spllx splly spurx spury
    userdict /AI3_noCropMarks {} put
    startTexFig
    doclip
    % angle (the angle must have a default value---may be nonzero)
    rotate
    % compensate for what Textures will do
    pop pop translate
    } N
   /eps-import {endTexFig} N
   }%
  \special{prepostscript
   end
   }%
  % End of entries for PSFig dict
 }%
%AO - tentative for dvips/DOS
\def\DOSDriver{%
	\ps@typeout{psfig/tex \PsfigVersion -dvips/DOS}%
 \def\@p@sspecials{\DvipsSpecials}%
	\def\@p@sdir{/}%
	\def\@p@ssep{;}%
 \@p@smakePaths
 \psfigurepath{.}% default is the current directory
 }%
%AO - initialize variables to Unix values
	\def\@p@sdir{/}%
	\def\@p@ssep{:}%
 \def\@p@sfigurepath{./}%
%
%% Here's how you define your figure path.  Should be set up with null
%% default and a user useable definition.
%AO the following example for Unix specifies searching the current directory:
% \psfigurepath{./}%
%AO the following example for Textures (Macintosh) specifies searching
%   the document folder, a folder in the parent's folder called figs,
%   and the root folder of a volume called Graphics
% \psfigurepath{;::figs;Graphics}%
%
\def\psfigurepath#1{\edef\@p@sfigurepath{#1}}%
%%% inserted for searching list of paths
%%% (the path must end with the list separator)
%%% (call: \@p@sDoPaths\@p@sfigurepath )
%%%------------------------------------------------------
%
\def\leer{}%
%
%AO - the macro \@p@smakePaths establishes the definitions of \@p@sDoPaths and \@p@sEachPath
% using the current value for \@p@ssep. For Unix, this is the equivalent of:
%\def\@p@sDoPaths#1{\expandafter\@p@sEachPath#1:\stoplist}%
%\def\@p@sEachPath#1:#2\stoplist{\@p@s@EachPath{#1}{#2}}% #1 part of the list (delimiter :)
% Macintosh and DOS had better use semicolon for the separator, because in each case
% the colon is part of the native filesystem's syntax.
%
\def\@p@smakePaths{%
 \edef\@tempa{%
  \def\noexpand\@p@sDoPaths####1{\noexpand\expandafter\noexpand\@p@sEachPath####1\@p@ssep\noexpand\stoplist}%
  }\@tempa
 \edef\@tempa{%
  \def\noexpand\@p@sEachPath####1\@p@ssep####2\noexpand\stoplist{\noexpand\@p@s@EachPath{####1}{####2}}%
  }\@tempa
 }%
%
%AO - procedure for each path in the pathlist. Terminate search at first hit.
\def\@p@s@EachPath#1#2{%
 \ExistsFile{#1}{\SearchedFile}%
 \ifx\ps@founddir\undefined
  \def\@tempa{#2}\ifx\@tempa\leer\else
   \expandafter\@p@sEachPath#2\stoplist
   \fi
  \fi
 }%
%
% exists the file (does not work for directories!)
%
%AO - include \@p@sdir
\def\ps@path@name#1{#1\@p@sdir}%
%AO - channel should be allocated with \newread! Use \ps@stream.
\def\ExistsFile#1#2{%
 \openin\ps@stream=\ps@path@name{#1}#2\relax
 \ifeof\ps@stream
  %\ps@typeout{...not: \ps@path@name{#1}#2}%
  \else
  %\ps@typeout{...in:  \ps@path@name{#1}#2}%
  \ifx\ps@founddir\undefined
   %\ps@typeout{set founddir #1}%
   \edef\ps@founddir{#1}%
   \fi
  \fi
 \closein\ps@stream
 }%
%------------------------------------------------------
%
% Get dir in path or error
%
\def\get@dir#1{%
 \def\SearchedFile{#1}%
 \@p@sDoPaths\@p@sfigurepath
 }%
%------------------------------------------------------
%%% END of Searching Unixpaths


%
% @psdo control structure -- similar to Latex @for.
% I redefined these with different names so that psfig can
% be used with TeX as well as LaTeX, and so that it will not
% be vunerable to future changes in LaTeX's internal
% control structure,
%
\def\@nnil{\@nil}%
\def\@empty{}%
\def\@psdonoop#1\@@#2#3{}%
\def\@psdo#1:=#2\do#3{\edef\@psdotmp{#2}\ifx\@psdotmp\@empty \else
    \expandafter\@psdoloop#2,\@nil,\@nil\@@#1{#3}\fi}%
\def\@psdoloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else
       #5\def#4{#2}\ifx #4\@nnil \else#5\@ipsdoloop #3\@@#4{#5}\fi\fi}%
\def\@ipsdoloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
       \let\@nextwhile=\@psdonoop \else
      #4\relax\let\@nextwhile=\@ipsdoloop\fi\@nextwhile#2\@@#3{#4}}%
\def\@tpsdo#1:=#2\do#3{\xdef\@psdotmp{#2}\ifx\@psdotmp\@empty \else
    \@tpsdoloop#2\@nil\@nil\@@#1{#3}\fi}%
\def\@tpsdoloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
       \let\@nextwhile=\@psdonoop \else
      #4\relax\let\@nextwhile=\@tpsdoloop\fi\@nextwhile#2\@@#3{#4}}%
%
% \fbox is defined in latex.tex; so if \fbox is undefined, assume that
% we are not in LaTeX.
% Perhaps this could be done better???
\ifx\undefined\fbox
% \fbox code from modified slightly from LaTeX
\newdimen\fboxrule
\newdimen\fboxsep
\newdimen\ps@tempdima
\newbox\ps@tempboxa
\fboxsep = 3pt
\fboxrule = .4pt
\long\def\fbox#1{\leavevmode\setbox\ps@tempboxa\hbox{#1}\ps@tempdima\fboxrule
    \advance\ps@tempdima \fboxsep \advance\ps@tempdima \dp\ps@tempboxa
   \hbox{\lower \ps@tempdima\hbox
  {\vbox{\hrule height \fboxrule
          \hbox{\vrule width \fboxrule \hskip\fboxsep
          \vbox{\vskip\fboxsep \box\ps@tempboxa\vskip\fboxsep}\hskip
                 \fboxsep\vrule width \fboxrule}%
                 \hrule height \fboxrule}}}}%
\fi
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% file reading stuff from epsf.tex
%   EPSF.TEX macro file:
%   Written by Tomas Rokicki of Radical Eye Software, 29 Mar 1989.
%   Revised by Don Knuth, 3 Jan 1990.
%   Revised by Tomas Rokicki to accept bounding boxes with no
%      space after the colon, 18 Jul 1990.
%   Portions modified/removed for use in PSFIG package by
%      J. Daniel Smith, 9 October 1990.
%
\newread\ps@stream
\newif\ifnot@eof       % continue looking for the bounding box?
\newif\if@noisy        % report what you're making?
\newif\if@atend        % %%BoundingBox: has (at end) specification
\newif\if@psfile       % does this look like a PostScript file?
%
% PostScript files should start with `%!'
%
{\catcode`\%=12\global\gdef\epsf@start{%!}}%
\def\epsf@PS{PS}%
%
\def\epsf@getbb#1{%
%
%   The first thing we need to do is to open the
%   PostScript file, if possible.
%
%AO - \@p@sdir already included in the filename
\openin\ps@stream=#1
\ifeof\ps@stream\ps@typeout{Error, File #1 not found}\else
%
%   Okay, we got it. Now we'll scan lines until we find one that doesn't
%   start with %. We're looking for the bounding box comment.
%
   {\not@eoftrue \chardef\other=12
    \def\do##1{\catcode`##1=\other}\dospecials \catcode`\ =10
    \loop
       \if@psfile
	  \read\ps@stream to \epsf@fileline
       \else{%
	  \obeyspaces
          \read\ps@stream to \epsf@tmp\global\let\epsf@fileline\epsf@tmp}%
       \fi
       \ifeof\ps@stream\not@eoffalse\else
%
%   Check the first line for `%!'.  Issue a warning message if its not
%   there, since the file might not be a PostScript file.
%
       \if@psfile\else
       \expandafter\epsf@test\epsf@fileline:. \\%
       \fi
%
%   We check to see if the first character is a % sign;
%   if so, we look further and stop only if the line begins with
%   `%%BoundingBox:' and the `(atend)' specification was not found.
%   That is, the only way to stop is when the end of file is reached,
%   or a `%%BoundingBox: llx lly urx ury' line is found.
%
          \expandafter\epsf@aux\epsf@fileline:. \\%
       \fi
   \ifnot@eof\repeat
   }\closein\ps@stream\fi}%
%
% This tests if the file we are reading looks like a PostScript file.
%
\long\def\epsf@test#1#2#3:#4\\{\def\epsf@testit{#1#2}%
			\ifx\epsf@testit\epsf@start\else
\ps@typeout{Warning! File does not start with `\epsf@start'.  It may not be a PostScript file.}%
			\fi
			\@psfiletrue}% don't test after 1st line
%
%   We still need to define the tricky \epsf@aux macro. This requires
%   a couple of magic constants for comparison purposes.
%
{\catcode`\%=12\global\let\epsf@percent=%\global\def\epsf@bblit{%BoundingBox}}%
%
%
%   So we're ready to check for `%BoundingBox:' and to grab the
%   values if they are found.  We continue searching if `(at end)'
%   was found after the `%BoundingBox:'.
%
\long\def\epsf@aux#1#2:#3\\{\ifx#1\epsf@percent
   \def\epsf@testit{#2}\ifx\epsf@testit\epsf@bblit
	\@atendfalse
        \epsf@atend #3 . \\%
	\if@atend	
	   \if@verbose{%
		\ps@typeout{psfig: found `(atend)'; continuing search}%
	   }\fi
        \else
        \epsf@grab #3 . . . \\%
        \not@eoffalse
        \global\no@bbfalse
        \fi
   \fi\fi}%
%
%   Here we grab the values and stuff them in the appropriate definitions.
%
\def\epsf@grab #1 #2 #3 #4 #5\\{%
   \global\def\epsf@llx{#1}\ifx\epsf@llx\empty
      \epsf@grab #2 #3 #4 #5 .\\\else
   \global\def\epsf@lly{#2}%
   \global\def\epsf@urx{#3}\global\def\epsf@ury{#4}\fi}%
%
% Determine if the stuff following the %%BoundingBox is `(atend)'
% J. Daniel Smith.  Copied from \epsf@grab above.
%
\def\epsf@atendlit{(atend)}%
\def\epsf@atend #1 #2 #3\\{%
   \def\epsf@tmp{#1}\ifx\epsf@tmp\empty
      \epsf@atend #2 #3 .\\\else
   \ifx\epsf@tmp\epsf@atendlit\@atendtrue\fi\fi}%


% End of file reading stuff from epsf.tex
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% trigonometry stuff from "trig.tex"
\chardef\psletter = 11 % won't conflict with \begin{letter} now...
\chardef\other = 12

\newif \ifdebug %%% turn me on to see TeX hard at work ...
\newif\ifc@mpute %%% don't need to compute some values
\c@mputetrue % but assume that we do

\let\then = \relax
\def\r@dian{pt }%
\let\r@dians = \r@dian
\let\dimensionless@nit = \r@dian
\let\dimensionless@nits = \dimensionless@nit
\def\internal@nit{sp }%
\let\internal@nits = \internal@nit
\newif\ifstillc@nverging
\def \Mess@ge #1{\ifdebug \then \message {#1}\fi}%

{%%% Things that need abnormal catcodes %%%
	\catcode `\@ = \psletter
	\gdef \nodimen {\expandafter \n@dimen \the \dimen}%
	\gdef \term #1 #2 #3%
	       {\edef \t@ {\the #1}%%% freeze parameter 1 (count, by value)
		\edef \t@@ {\expandafter \n@dimen \the #2\r@dian}%
				   %%% freeze parameter 2 (dimen, by value)
  %AO - the \space(s) token in the following line is deliberate
		\t@rm {\t@} {\t@@} {#3}%
	       }%
	\gdef \t@rm #1 #2 #3%
	       {{%
		\count 0 = 0
		\dimen 0 = 1 \dimensionless@nit
		\dimen 2 = #2\relax
		\Mess@ge {Calculating term #1 of \nodimen 2}%
		\loop
		\ifnum	\count 0 &lt; #1
		\then	\advance \count 0 by 1
			\Mess@ge {Iteration \the \count 0 \space}%
			\Multiply \dimen 0 by {\dimen 2}%
			\Mess@ge {After multiplication, term = \nodimen 0}%
			\Divide \dimen 0 by {\count 0}%
			\Mess@ge {After division, term = \nodimen 0}%
		\repeat
		\Mess@ge {Final value for term #1 of
				\nodimen 2 \space is \nodimen 0}%
		\xdef \Term {#3 = \nodimen 0 \r@dians}%
		\aftergroup \Term
	       }}%
	\catcode `\p = \other
	\catcode `\t = \other
	\gdef \n@dimen #1pt{#1}%%% throw away the ``pt''
}%

\def \Divide #1by #2{\divide #1 by #2}%%% just a synonym

\def \Multiply #1by #2%%% allows division of a dimen by a dimen
       {{%%% should really freeze parameter 2 (dimen, passed by value)
	\count 0 = #1\relax
	\count 2 = #2\relax
	\count 4 = 65536
	\Mess@ge {Before scaling, count 0 = \the \count 0 \space and
			count 2 = \the \count 2}%
	\ifnum	\count 0 &gt; 32767 %%% do our best to avoid overflow
	\then	\divide \count 0 by 4
		\divide \count 4 by 4
	\else	\ifnum	\count 0 &lt; -32767
		\then	\divide \count 0 by 4
			\divide \count 4 by 4
		\else
		\fi
	\fi
	\ifnum	\count 2 &gt; 32767 %%% while retaining reasonable accuracy
	\then	\divide \count 2 by 4
		\divide \count 4 by 4
	\else	\ifnum	\count 2 &lt; -32767
		\then	\divide \count 2 by 4
			\divide \count 4 by 4
		\else
		\fi
	\fi
	\multiply \count 0 by \count 2
	\divide \count 0 by \count 4
	\xdef \product {#1 = \the \count 0 \internal@nits}%
	\aftergroup \product
       }}%

\def\r@duce{\ifdim\dimen0 &gt; 90\r@dian \then   % sin(x+90) = sin(180-x)
		\multiply\dimen0 by -1
		\advance\dimen0 by 180\r@dian
		\r@duce
	    \else \ifdim\dimen0 &lt; -90\r@dian \then  % sin(-x) = sin(360+x)
		\advance\dimen0 by 360\r@dian
		\r@duce
		\fi
	    \fi}%

\def\Sine#1%
       {{%
	\dimen 0 = #1 \r@dian
	\r@duce
	\ifdim\dimen0 = -90\r@dian \then
	   \dimen4 = -1\r@dian
	   \c@mputefalse
	\fi
	\ifdim\dimen0 = 90\r@dian \then
	   \dimen4 = 1\r@dian
	   \c@mputefalse
	\fi
	\ifdim\dimen0 = 0\r@dian \then
	   \dimen4 = 0\r@dian
	   \c@mputefalse
	\fi
%
	\ifc@mpute \then
        	% convert degrees to radians
		\divide\dimen0 by 180
		\dimen0=3.141592654\dimen0
%
		\dimen 2 = 3.1415926535897963\r@dian %%% a well-known constant
		\divide\dimen 2 by 2 %%% we only deal with -pi/2 : pi/2
		\Mess@ge {Sin: calculating Sin of \nodimen 0}%
		\count 0 = 1 %%% see power-series expansion for sine
		\dimen 2 = 1 \r@dian %%% ditto
		\dimen 4 = 0 \r@dian %%% ditto
		\loop
			\ifnum	\dimen 2 = 0 %%% then we've done
			\then	\stillc@nvergingfalse
			\else	\stillc@nvergingtrue
			\fi
			\ifstillc@nverging %%% then calculate next term
   %AO - the \space token(s) in the following line is deliberate
			\then	\term {\count 0} {\dimen 0} {\dimen 2}%
				\advance \count 0 by 2
				\count 2 = \count 0
				\divide \count 2 by 2
				\ifodd	\count 2 %%% signs alternate
				\then	\advance \dimen 4 by \dimen 2
				\else	\advance \dimen 4 by -\dimen 2
				\fi
		\repeat
	\fi		
			\xdef \sine {\nodimen 4}%
       }}%

% Now the Cosine can be calculated easily by calling \Sine
\def\Cosine#1{\ifx\sine\UnDefined\edef\Savesine{\relax}\else
		             \edef\Savesine{\sine}\fi
	{\dimen0=#1\r@dian\advance\dimen0 by 90\r@dian
	 \Sine{\nodimen 0}%
	 \xdef\cosine{\sine}%
	 \xdef\sine{\Savesine}}}%
% end of trig stuff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def\psdraft{%
	\def\@psdraft{0}%
	%\ps@typeout{draft level now is \@psdraft \space . }%
}%
\def\psfull{%
	\def\@psdraft{100}%
	%\ps@typeout{draft level now is \@psdraft \space . }%
}%

\psfull

\newif\if@scalefirst
\def\psscalefirst{\@scalefirsttrue}%
\def\psrotatefirst{\@scalefirstfalse}%
\psrotatefirst

\newif\if@draftbox
\def\psnodraftbox{%
	\@draftboxfalse
}%
\def\psdraftbox{%
	\@draftboxtrue
}%
\@draftboxtrue

\newif\if@prologfile
\newif\if@postlogfile
\def\pssilent{%
	\@noisyfalse
}%
\def\psnoisy{%
	\@noisytrue
}%
\psnoisy
%%% These are for the option list.
%%% A specification of the form a = b maps to calling \@p@@sa{b}%
\newif\if@bbllx
\newif\if@bblly
\newif\if@bburx
\newif\if@bbury
\newif\if@height
\newif\if@width
\newif\if@rheight
\newif\if@rwidth
\newif\if@angle
\newif\if@clip
\newif\if@stroke
\newif\if@verbose
% AO - added preview option: says to show the imported graphic on the preview screen.
% This option is currently not supported except in DPS systems. But Textures support is "on the way".
\newif\if@preview
\def\@p@@sclip#1{\@cliptrue}%
\def\@p@@sstroke#1{\@stroketrue}%
%
%
\newif\if@decmpr
%
\def\@p@@sfigure#1{\def\@p@sfile{null}\def\@p@sbbfile{null}\@decmprfalse
 %AO - This proc is needlessly complicated. Just tell the user that if using \psfigurepath,
 %   he/she must explicitly include the current dir if so desired, and supply
 %   that as the default.
 %AO - channel should be allocated with \newread! Use \ps@stream.
 \let\ps@founddir\undefined
	\get@dir{#1}%
	\ifx\ps@founddir\undefined	% failed, search directly for file.bb
		\get@dir{#1.bb}%
		\ifx\ps@founddir\undefined	% failed, lose.
			\ps@typeout{Can't find #1 in "\@p@sfigurepath"}%
	 	\else	% found file.bb in search dir
			\@decmprtrue
			\def\@p@sfile{\ps@path@name\ps@founddir#1}%
			\def\@p@sbbfile{\ps@path@name\ps@founddir#1.bb}%
			\fi
	 \else	% found file in search dir
		\def\@p@sfile{\ps@path@name\ps@founddir#1}%
		\def\@p@sbbfile{\ps@path@name\ps@founddir#1}%
	 \fi
 }%
%
\def\@p@@sfile#1{\@p@@sfigure{#1}}%
%
\def\@p@@sbbllx#1{%
		%\ps@typeout{bbllx is #1}%
		\@bbllxtrue
		%AO - dimen should be allocated by \newdimen!
		\bb@dimen=#1
		\edef\@p@sbbllx{\number\bb@dimen}%
}%
\def\@p@@sbblly#1{%
		%\ps@typeout{bblly is #1}%
		\@bbllytrue
		\bb@dimen=#1
		\edef\@p@sbblly{\number\bb@dimen}%
}%
\def\@p@@sbburx#1{%
		%\ps@typeout{bburx is #1}%
		\@bburxtrue
		\bb@dimen=#1
		\edef\@p@sbburx{\number\bb@dimen}%
}%
\def\@p@@sbbury#1{%
		%\ps@typeout{bbury is #1}%
		\@bburytrue
		\bb@dimen=#1
		\edef\@p@sbbury{\number\bb@dimen}%
}%
\def\@p@@sheight#1{%
		\@heighttrue
		\bb@dimen=#1
   		\edef\@p@sheight{\number\bb@dimen}%
		%\ps@typeout{Height is \@p@sheight}%
}%
\def\@p@@swidth#1{%
		%\ps@typeout{Width is #1}%
		\@widthtrue
		\bb@dimen=#1
		\edef\@p@swidth{\number\bb@dimen}%
}%
\def\@p@@srheight#1{%
		%\ps@typeout{Reserved height is #1}%
		\@rheighttrue
		\bb@dimen=#1
		\edef\@p@srheight{\number\bb@dimen}%
}%
\def\@p@@srwidth#1{%
		%\ps@typeout{Reserved width is #1}%
		\@rwidthtrue
		\bb@dimen=#1
		\edef\@p@srwidth{\number\bb@dimen}%
}%
\def\@p@@sangle#1{%
		%\ps@typeout{Rotation is #1}%
		\@angletrue
%		\bb@dimen=#1
		\edef\@p@sangle{#1}%AO balance braces {\number\bb@dimen}%
}%
\def\@p@@ssilent#1{%
		\@verbosefalse
}%
\def\@p@@spreview#1{%
		\@previewtrue
}%
\def\@p@@sprolog#1{%
 \@prologfiletrue
 \def\@p@spolog{#1}%
 }%
\def\@p@@spostlog#1{%
 \@postlogfiletrue
 \def\@p@spostlog{#1}%
 }%
\def\@cs@name#1{\csname #1\endcsname}%
\def\@setparms#1=#2,{\@cs@name{@p@@s#1}{#2}}%
%
% initialize the defaults (size the size of the figure)
%
\def\ps@init@parms{%
		\@bbllxfalse \@bbllyfalse
		\@bburxfalse \@bburyfalse
		\@heightfalse \@widthfalse
		\@rheightfalse \@rwidthfalse
  %AO - init Rokicki's stuff, too
  \def\epsf@llx{0}\def\epsf@lly{0}\def\epsf@urx{0}\def\epsf@ury{0}%
		\def\@p@sbbllx{}\def\@p@sbblly{}%
		\def\@p@sbburx{}\def\@p@sbbury{}%
		\def\@p@sheight{}\def\@p@swidth{}%
		\def\@p@srheight{}\def\@p@srwidth{}%
		\def\@p@sangle{0}%
		\def\@p@sfile{}\def\@p@sbbfile{}%
		\def\@p@scost{10}%
		\def\@sc{}%
		\@prologfilefalse
		\@postlogfilefalse
		\@clipfalse
		\if@noisy
			\@verbosetrue
		\else
			\@verbosefalse
		\fi
}%
%
% Go through the options setting things up.
%
\def\parse@ps@parms#1{%
	 	\@psdo\@psfiga:=#1\do
		   {\expandafter\@setparms\@psfiga,}%
 }%
%
% rotate point (#1,#2) about (0,0).
% The sine and cosine of the angle are already stored in \sine and
% \cosine.  The result is placed in (\p@intvaluex, \p@intvaluey).
\newdimen\p@intvaluex
\newdimen\p@intvaluey
\def\rotate@#1#2{{\dimen0=#1 sp\dimen1=#2 sp
%            	calculate x' = x \cos\theta - y \sin\theta
		  \global\p@intvaluex=\cosine\dimen0
		  \dimen3=\sine\dimen1
		  \global\advance\p@intvaluex by -\dimen3
% 		calculate y' = x \sin\theta + y \cos\theta
		  \global\p@intvaluey=\sine\dimen0
		  \dimen3=\cosine\dimen1
		  \global\advance\p@intvaluey by \dimen3
		  }}%
%
% Compute bb height and width
%		
%AO - provide for always reading the EPS file for its bounding box.
\newif\if@bb@always
\newif\ifno@bb
\newdimen\bb@dimen
\newcount\@p@stemp
%
\def\compute@bb{%
 %AO - 
 %  If the user did not completely specify the boundingbox,
 %  then extract those values from the EPS file.
 %  Even if so, we may still need to at least read the EPS's boundingbox.
 %  Note: I've combined the old bbcull and bbmissing into this procedure.
	\no@bbfalse
	\if@bbllx \else \no@bbtrue \fi
	\if@bblly \else \no@bbtrue \fi
	\if@bburx \else \no@bbtrue \fi
	\if@bbury \else \no@bbtrue \fi
 \ifno@bb
  \@p@ssearchbb% no@bb is set by \epsf@getbb if bb is found in the EPS file
  \ifno@bb\else
  	\bb@dimen=\epsf@llx bp\edef\@p@sbbllx{\number\bb@dimen}%
  	\bb@dimen=\epsf@lly bp\edef\@p@sbblly{\number\bb@dimen}%
  	\bb@dimen=\epsf@urx bp\edef\@p@sbburx{\number\bb@dimen}%
  	\bb@dimen=\epsf@ury bp\edef\@p@sbbury{\number\bb@dimen}%
   \fi
  \else
  \if@bb@always
   \@p@ssearchbb
   \fi
  \fi
	\ifno@bb \ps@typeout{FATAL ERROR: no bb supplied or found}%
 	\no@bb@error
	\fi
	%
 %\ps@typeout{BB: \@p@sbbllx, \@p@sbblly, \@p@sbburx, \@p@sbbury}%
 %
 % store height/width of original (unrotated) bounding box
 %
	\@p@stemp=\@p@sbburx\advance\@p@stemp by -\@p@sbbllx\edef\ps@bbw{\number\@p@stemp}%
	\@p@stemp=\@p@sbbury\advance\@p@stemp by -\@p@sbblly\edef\ps@bbh{\number\@p@stemp}%
	%\ps@typeout{psbbh = \ps@bbh, psbbw = \ps@bbw }%
 %
 % calculate values of rotated object
 %
	\if@angle
		\Sine{\@p@sangle}\Cosine{\@p@sangle}%
  %
  % Need to rotate all four points and take the X-Y extremes of the new
  % points as the new bounding box.
  %
  {% preset for minmax test
   \bb@dimen=\maxdimen
   \xdef\r@p@sbbllx{\number\bb@dimen}%
   \xdef\r@p@sbblly{\number\bb@dimen}%
	  \xdef\r@p@sbburx{-\number\bb@dimen}%
	  \xdef\r@p@sbbury{-\number\bb@dimen}%
   }%
		\rotate@{\@p@sbbllx}{\@p@sbblly}\minmaxtest%			lower left
		\rotate@{\@p@sbbllx}{\@p@sbbury}\minmaxtest%			upper left
		\rotate@{\@p@sbburx}{\@p@sbblly}\minmaxtest%			lower right
		\rotate@{\@p@sbburx}{\@p@sbbury}\minmaxtest%			upper right
  %
		\edef\@p@sbbllx{\r@p@sbbllx}\edef\@p@sbblly{\r@p@sbblly}%
		\edef\@p@sbburx{\r@p@sbburx}\edef\@p@sbbury{\r@p@sbbury}%
  %\ps@typeout{rotated BB: \r@p@sbbllx, \r@p@sbblly, \r@p@sbburx, \r@p@sbbury}%
		\fi % @angle
	\@p@stemp=\@p@sbburx\advance\@p@stemp by -\@p@sbbllx\edef\@bbw{\number\@p@stemp}%
	\@p@stemp=\@p@sbbury\advance\@p@stemp by -\@p@sbblly\edef\@bbh{\number\@p@stemp}%
	%\ps@typeout{bbh = \@bbh, bbw = \@bbw }%
 }%
%
%AO - I've put this definition out here in global scope
\def\minmaxtest{%
	\ifnum\number\p@intvaluex&lt;\r@p@sbbllx\xdef\r@p@sbbllx{\number\p@intvaluex}\fi
	\ifnum\number\p@intvaluex&gt;\r@p@sbburx\xdef\r@p@sbburx{\number\p@intvaluex}\fi
	\ifnum\number\p@intvaluey&lt;\r@p@sbblly\xdef\r@p@sbblly{\number\p@intvaluey}\fi
	\ifnum\number\p@intvaluey&gt;\r@p@sbbury\xdef\r@p@sbbury{\number\p@intvaluey}\fi
 }%
%
\def\@p@ssearchbb{%
	\if@verbose{%
	 \ps@typeout{psfig: searching \@p@sbbfile \space  for bounding box}%
 	}\fi
 \epsf@getbb{\@p@sbbfile}%
 }%
%AO define this error escape
\def\no@bb@error{%
 \def\@p@sbbllx{0}\def\@p@sbblly{0}\def\@p@sbburx{100}\def\@p@sbbury{100}%
 }%
%
% \in@hundreds performs #1 * (#2 / #3) correct to the hundreds,
%	then leaves the result in @result
%
\def\in@hundreds#1#2#3{\count240=#2 \count241=#3
		     \count100=\count240	% 100 is first digit #2/#3
		     \divide\count100 by \count241
		     \count101=\count100
		     \multiply\count101 by \count241
		     \advance\count240 by -\count101
		     \multiply\count240 by 10
		     \count101=\count240	%101 is second digit of #2/#3
		     \divide\count101 by \count241
		     \count102=\count101
		     \multiply\count102 by \count241
		     \advance\count240 by -\count102
		     \multiply\count240 by 10
		     \count102=\count240	% 102 is the third digit
		     \divide\count102 by \count241
		     \count200=#1\count205=0
		     \count201=\count200
			\multiply\count201 by \count100
		 	\advance\count205 by \count201
		     \count201=\count200
			\divide\count201 by 10
			\multiply\count201 by \count101
			\advance\count205 by \count201
			%
		     \count201=\count200
			\divide\count201 by 100
			\multiply\count201 by \count102
			\advance\count205 by \count201
			%
		     \edef\@result{\number\count205}%
}%
\def\compute@wfromh{%
		% computing : width = height * (bbw / bbh)
		\in@hundreds{\@p@sheight}{\@bbw}{\@bbh}%
		%\ps@typeout{\@p@sheight * \@bbw / \@bbh, = \@result }%
		\edef\@p@swidth{\@result}%
		%\ps@typeout{w from h: width is \@p@swidth}%
}%
\def\compute@hfromw{%
		% computing : height = width * (bbh / bbw)
	        \in@hundreds{\@p@swidth}{\@bbh}{\@bbw}%
		%\ps@typeout{\@p@swidth * \@bbh / \@bbw = \@result }%
		\edef\@p@sheight{\@result}%
		%\ps@typeout{h from w : height is \@p@sheight}%
}%
\def\compute@handw{%
		\if@height
			\if@width
			\else
				\compute@wfromh
			\fi
		\else
			\if@width
				\compute@hfromw
			\else
				\edef\@p@sheight{\@bbh}%
				\edef\@p@swidth{\@bbw}%
			\fi
		\fi
}%
\def\compute@resv{%
		\if@rheight \else \edef\@p@srheight{\@p@sheight}\fi
		\if@rwidth \else \edef\@p@srwidth{\@p@swidth}\fi
		%\ps@typeout{rheight = \@p@srheight, rwidth = \@p@srwidth}%
}%
%
% Compute any missing values
\def\compute@sizes{%
	\compute@bb
	\if@scalefirst\if@angle
% at this point the bounding box has been adjusted correctly for
% rotation.  PSFIG does all of its scaling using \@bbh and \@bbw.  If
% a width= or height= was specified along with \psscalefirst, then the
% width=/height= value needs to be adjusted to match the new (rotated)
% bounding box size (specifed in \@bbw and \@bbh).
%    \ps@bbw       width=
%    -------  =  ----------
%    \@bbw       new width=
% so `new width=' = (width= * \@bbw) / \ps@bbw; where \ps@bbw is the
% width of the original (unrotated) bounding box.
	\if@width
	   \in@hundreds{\@p@swidth}{\@bbw}{\ps@bbw}%
	   \edef\@p@swidth{\@result}%
	\fi
	\if@height
	   \in@hundreds{\@p@sheight}{\@bbh}{\ps@bbh}%
	   \edef\@p@sheight{\@result}%
	\fi
	\fi\fi
	\compute@handw
	\compute@resv
}%
%
%AO - driver for Textures
%
{\catcode`\%=12\gdef\percent@char{%}}%
%
\def\TexturesSpecials{%
 \begingroup
  % Beginning of PS code for imported EPS
  \special{rawpostscript \percent@char PSFig: begin import}%
  \special{rawpostscript PSFig begin}%
  \special{rawpostscript /sps-save save def}%
  \if@prologfile
   % The prolog (equally the postlog) will see TeXdict at the top of the dict stack,
   % But if they wish, they can store definitions into userdict (a good choice).
   % The currentpoint will be the same as that of the graphic, but no scaling or
   % translate is in effect right now.
   % The code in prolog (or postlog) must not leave the operand stack 
   % or the dictionary stack altered.
   \special{rawpostscript /sps {sps-prolog}def /eps {eps-prolog}def}%
   \special{postscriptfile \@p@sprolog}%
   \fi
  % Locally redefine sps and eps (this is the magic step).
  \special{rawpostscript /sps {sps-import}def /eps {eps-import}def}%
  % Define what's to be done with the clipping path;
  % it can be left alone, stroked, clipped to, or both
  \edef\@tempa{%
   \special{rawpostscript 
    /clip-stroke {%
     \if@stroke dostroke \fi 
     \if@clip clip \fi 
     }def
    }%
   }\@tempa
  % Push arguments to the startTeXFig operator
  \special{rawpostscript 
   \if@preview 
    \epsf@llx\space\epsf@lly\space\epsf@urx\space\epsf@ury\space
    \else
    0 0 0 0 
    \fi
   \@p@sangle\space
   \@p@swidth\space\@p@sheight\space
   \@p@sbbllx\space\@p@sbblly\space\@p@sbburx\space\@p@sbbury\space
   }%
  % Calculate values for horizontal and vertical scale
  % These values will only have an effect on the screen preview---and that's 
  % disabled until Barry puts in the "replacement BoundingBox" capability
  \@p@stemp\@p@sbburx\advance\@p@stemp-\@p@sbbllx
  \in@hundreds\@m\@p@swidth\@p@stemp
  \edef\@tempa{\@result}%
  \@p@stemp\@p@sbbury\advance\@p@stemp-\@p@sbblly
  \in@hundreds\@m\@p@sheight\@p@stemp
  \edef\@tempa{\@tempa\space\@result}%
  % Import the eps now
  \if@decmpr{%
   \if@verbose{\ps@typeout{psfig: decompression not supported}}\fi
   }\else{%
   \if@verbose{\ps@typeout{psfig: including eps \@p@sfile \space }}\fi
   \edef\@tempa{%
    %Note: Textures 1.7 automatically says:
    % &lt;sx&gt; &lt;sy&gt; &lt;cx&gt; &lt;cy&gt; sps
    %%BeginDocument: &lt;filename&gt;
    % &lt;your eps file here&gt;
    %%EndDocument
    % end eps
    \special{\if@preview illustration\else postscriptfile\fi\space\@p@sfile\space scaled \@tempa}%
    }\@tempa
   }\fi
  \if@postlogfile
   \special{rawpostscript /sps {sps-prolog}def /eps {eps-prolog}def}%
   \special{postscriptfile \@p@spostlog}%
   \fi
  \special{rawpostscript sps-save restore}%
  \special{rawpostscript end}%
  \special{rawpostscript \percent@char PSFig: end import}%
  % End of PS code for imported EPS
  \endgroup
 }%
%
\def\OzTeXSpecials{%
	\special{empty.ps /@isp {true}def}%
	\special{empty.ps 
	 \@p@swidth \space \@p@sheight \space
		\@p@sbbllx \space \@p@sbblly \space
		\@p@sbburx \space \@p@sbbury \space
		startTexFig \space 
		}%
  % Define what's to be done with the clipping path; it can be 
  % left alone, stroked, clipped to, or both
  \edef\@tempa{%
   \special{empty.ps
    /clip-stroke {%
     \if@stroke dostroke \fi 
     \if@clip clip \fi 
     }def
    doclip
    }%
   }\@tempa
	\if@verbose
 	\if@clip
	 	\ps@typeout{(clip)}%
 	 \fi
 	\if@stroke
	 	\ps@typeout{(stroke)}%
 	 \fi
	\fi
	\if@angle
		\if@verbose{%
			\ps@typeout{(angle)}%
		}\fi
	\fi
	\special {empty.ps \@p@sangle \space rotate \space}%
	\if@prologfile
	    \special{\@p@spolog \space }\fi
	\if@decmpr{%
		\if@verbose{%
			\ps@typeout{psfig: Compression not available
			in OzTeX version \space }%
		}\fi
	}\else{%
		\if@verbose{%
			\ps@typeout{psfig: including \@p@sfile \space }%
		}\fi
		\special{epsf=\@p@sfile \space }%
	}\fi
	\if@postlogfile
	    \special{\@p@spostlog \space }\fi
	\special{empty.ps /@isp {false}def}%
}%
%
\def\DvipsSpecials{%
	%
	\special{ps::[begin] 	
	 \@p@swidth \space \@p@sheight \space
		\@p@sbbllx \space \@p@sbblly \space
		\@p@sbburx \space \@p@sbbury \space
		startTexFig \space 
		}%
  % Define what's to be done with the clipping path; it can be 
  % left alone, stroked, clipped to, or both
  \edef\@tempa{%
   \special{ps::
    /clip-stroke {%
     \if@stroke dostroke \fi 
     \if@clip clip \fi 
     }def
    doclip
    }%
   }\@tempa
	\if@verbose
 	\if@clip
	 	\ps@typeout{(clip)}%
 	 \fi
 	\if@stroke
	 	\ps@typeout{(stroke)}%
 	 \fi
	\fi
	\if@angle
		\if@verbose{%
			\ps@typeout{(angle)}%
		}\fi
	\fi
	\special {ps:: \@p@sangle \space rotate \space}%
	\if@prologfile
	    \special{ps: plotfile \@p@spolog \space }\fi
	\if@decmpr{%
		\if@verbose{%
			\ps@typeout{psfig: including \@p@sfile.Z \space }%
		}\fi
		\special{ps: plotfile "`zcat \@p@sfile.Z" \space }%
	}\else{%
		\if@verbose{%
			\ps@typeout{psfig: including \@p@sfile \space }%
		}\fi
		\special{ps: plotfile \@p@sfile \space }%
	}\fi
	\if@postlogfile
	    \special{ps: plotfile \@p@spostlog \space }\fi
	\special{ps::[end] endTexFig \space }%
}%
%
% \psfig
% usage : \psfig{file=, height=, width=, bbllx=, bblly=, bburx=, bbury=,
%			rheight=, rwidth=, clip=}%
%
% "clip=" is a switch and takes no value, but the `=' must be present.
%AO - eliminate spurious spaces
\def\psfig#1{\vbox {%
	% do a zero width hard space so that a single
	% \psfig in a centering enviornment will behave nicely
	%{\setbox0=\hbox{\ }\ \hskip-\wd0}%
	%
	\ps@init@parms
	\parse@ps@parms{#1}%
	\compute@sizes
	%
	\ifnum\@p@scost&lt;\@psdraft{%
		% Create the vbox to reserve the space for the figure.
		\vbox to \@p@srheight sp{%
 		% 1/92 TJD Changed from "true sp" to "sp" for magnification.
			\hbox to \@p@srwidth sp{\vbox to\@p@sheight sp{\@p@sspecials\vss}\hss}%
			\vss
		}%
	}\else{%
		% draft figure, just reserve the space and print the
		% path name.
		\if@draftbox{%
			% Verbose draft: print file name in box
			% 10/93 TJD changed to fbox from frame
			\hbox{\fbox{\vbox to \@p@srheight sp{%
			\vss
			\hbox to \@p@srwidth sp{\hss
			        % 10/93 TJD deleted to avoid ``_'' problems
				% \@p@sfile
			 \hss }%
			\vss
			}}}%
		}\else{%
			% Non-verbose draft
			\vbox to \@p@srheight sp{%
			\vss
			\hbox to \@p@srwidth sp{\hss}%
			\vss
			}%
		}\fi	
	}\fi
}}%
%
\psfigRestoreAt
\setDriver
\let\@=\LaTeXAtSign
</pre></body></html>