\documentstyle[10pt]{article}
\input psfig.tex
%\pagestyle{empty}
\begin{document}
\vfill
\begin{center}{\large\bf New Results on Perturbative Color Transparency

 in
Quasi-Exclusive Electroproduction}\end{center}\par
\vskip 0.5cm
\centerline{Pankaj Jain$^a$, Bijoy Kundu$^a$, John Ralston$^b$ and
Jim Samuelsson$^a$}
\vskip 0.5cm
\centerline{$^a$Physics Department, I.I.T. Kanpur, 208016, India}
\centerline{$^b$Department of Physics \& Astronomy, University of Kansas,}
\centerline{
Lawrence, KS 66045, USA }\par
\vskip 1.0cm
PACS number(s): 13.40.Fn, 12.38.Bx, 14.20.Dh
\vskip 2.0 cm
%\baselineskip=2\baselineskip
\centerline{\bf Abstract} We review the perturbative QCD
formalism of hadronic electromagnetic form factors and the color
transparency ratio for quasi-exclusive electroproduction of the proton and
pion from nuclear targets. We have completed the first full calculations
including all leading order quark subprocesses and integrations over
distribution amplitudes, including Sudakov effects. For the case of the
proton, the calculated result shows scaling beyond $Q^2=10$ GeV$^2$. The
calculation incorporating filtering due to the nuclear medium is cleaner
than the corresponding calculation in free space because of attenuation of
large distance amplitudes. We find that the color transparency ratio is
rather insensitive to theoretical uncertainties inherent in the
perturbative formalism, such as the choice of the hadron distribution
amplitude.

\bigskip

\section{Introduction}

The practical applicability of perturbative QCD to exclusive processes
\cite{GRF,GPL,CZ} such as hadronic electromagnetic form factors cannot yet
considered   to be settled. It has been argued that even at the highest
momenta explored so far in the laboratory, the dominant contribution to
form factors comes from the end point regions of the wave function,
where the perturbative treatment fails \cite{Isg,Rad}.
In the case of hadron-hadron scattering there exist further difficulties,
such as the common failure of the helicity conservation selection rules
to agree with experimental data.
However in nearly all experiments one finds that
the naive prediction for quark counting
scaling laws tend to agree very well with data. In view of the
problems listed, this is quite mysterious, since so far there does
not exist any alternate mechanism which can explain these scaling laws.

An interesting prediction of perturbative
QCD is color transparency \cite{BrodMuel}.
At large momentum transfers only the short distance components of the
hadron wave function can contribute to exclusive processes. Since
the total cross section of hadrons $\sigma$ is inversely proportional
to their area $b^2$, the strong interactions of these
hadrons is expected to be reduced. If we consider quasi-exclusive
electron-nucleus  scattering,
$eA\rightarrow e'p(A-1)$, where $A$ is nuclear number,
then the nucleus is predicted to be transparent to all protons participating
in this process.  This is an asymptotic argument applicable for fixed $A$
as $Q^2 \rightarrow\infty$.  Experimentally, however, we can only take
the limit of large $A$ and moderately large $Q^2$, in which such processes
appear to be more complicated and much more interesting.  One picture that
is emerging \cite{JPR}
is that exclusive processes in free space get significant
contribution from perturbatively calculable hard amplitudes
but also have non-negligible soft contamination.
The corresponding nuclear processes, however, may be much cleaner
\cite{JB,BT88} because the large quark separations will be
strongly attenuated in nuclear medium. This
phenomenon, called nuclear filtering, has some experimental support.
Experimentally one finds that the fixed-angle free space process
$pp'\rightarrow p''p'''$ \cite{Car} shows significant oscillations at 90
degrees as a function of energy.   These oscillations are not a small
effect, but roughly 50\% of the $1/s^{10}$ behavior, and are interpreted as
coming from interference of long and short distance amplitudes. The
corresponding process in a nuclear environment $pA\rightarrow p'p''(A-1)$
shows no oscillations, and obeys the pQCD scaling
power law better than the free-space data \cite{JB,BT88}. The $A$
dependence, when analyzed at fixed $Q^2$, shows statistically significant
evidence of reduced attenuation \cite{JainRalPRD}.


\section{Formalism}

We  briefly review the framework for calculation of hadronic
form factors following Li and Sterman \cite{LS}.  It has long been known
that the transverse separation of quarks in free space
reactions is controlled by effects known as the Sudakov form factor.  The
pion form factor is the simplest example. Li and Sterman  included Sudakov
effects here, arguing that a perturbative treatment becomes fairly reliable
at momenta of the order of 5 GeV.  As low as 2 GeV, it was found that less
than 50 \% of the contribution comes from the soft region.

Let $b_{ij}$ be the transverse separation between quarks $i$ and $j$, or
$b$ the corresponding quantity for a single pair of quarks.  An essential
feature is the inclusion of $exp(-S)$, a Sudakov form factor which
suppresses the large $b$ region. Including the $b$ dependence, the pion
electromagnetic form factor can be written as, \begin{eqnarray} F_\pi(Q^2)
= \int dx_1
dx_2{d\vec b\over (2\pi)^2} {\cal P}(x_2,\vec b,P',\mu) T_H(x_1,x_2,\vec
b,Q,\mu){\cal P}(x_2,\vec b,P,\mu)\ . \label{fpi} \end{eqnarray} where $${\cal
P}(x,b,P,\mu) = exp(-S)\times \phi(x,1/b) + O(\alpha_s(1/b))\ ,$$ plays the
role
of the hadron wave function, $\phi(x,1/b)$ is the meson distribution amplitude,
$P$ and $P'$ are the incident and outgoing pion momenta respectively, and
$S$ is
the Sudakov form factor. The improved factorization used in \cite{LS} retains
the intrinsic transverse momentum $k_T$ dependence in the gluon propagator,
since $k_T$ need not be small compared to $\sqrt{x_1x_2}Q$, if one of the $x_i$
get close to zero. The variable $b$ in Eq. \ref{fpi} is conjugate to $k_{T1} -
k_{T2}$, where $k_{T1}$ and $k_{T2}$ are the transverse momenta of the incident
and outgoing pions. As long as $x_1$ and $x_2$ are not close to their
endpoints,
the dominant scale in the scattering is $\sqrt{x_1x_2}Q$ and the small $b$
region dominates the amplitude. Close to the end points of $x_1$ or $x_2$,
$\sqrt{x_1x_2}Q$ may become very small. However, the dominant scale in this
region is $1/b$, which is again not too small since the large $b$ region is
strongly damped by the Sudakov form factor. The results for the free space
form
factor for pion using this procedure are given in \cite{LS}. The authors show
that at $Q^2=5$ GeV$^2$, something like 90\% of the contribution comes from a
region where $\alpha_s/\pi$ is less than 0.7 and hence could be regarded as
perturbative.

\medskip

The nuclear medium modifies the quark wave function such that
\cite{RP90,stmalo}
\begin{eqnarray} {\cal P}_A(x,b,P,\mu) = f_A(Q^2,b){\cal P}(x,b,P,\mu),
\end{eqnarray} where ${\cal P}_A$ is the wave function inside the medium and
$f_A$ is the nuclear filtering amplitude. We use a simple model for $f_A$,
$$f_A = exp(-\int dz\ \sigma \rho)\ \ .$$
The effective inelastic cross section $\sigma$ is known to scale like $b^2$ in
QCD, where $b$ is the size of the hadron. We parametrize it as $k b^2$ and
adjust the value of $k$ to find a reasonable fit to the experimental data.


The situation for the proton form factor \cite{LS1}
is somewhat more complicated than that of the pion; we do not have the
space for all details here which are given in Ref. \cite{BL,Bijoy99}. 
There has been some controversy regarding the
proper choice of the
infrared cutoff in the Sudakov exponent. In the case of pion this was
simply the quark-antiquark separation $b$. The choice proposed in
\cite{BK} uses the largest distance between the three quarks as the cutoff. It
was found that this gave results about 50 \% smaller than experiments.
Perhaps this is the right direction, if indeed other wave functions (and in
particular, non-zero quark angular momentum) contribute heavily in free space.
On the other hand, in \cite{BL} it was observed that the largest distance does
not correspond to a physical size of the three quark system. A more appropriate
choice might be obtained by considering the triplet of valence quarks
as a quark-diquark system.
This choice takes the maximum value of the distance between quark and
diquark as
the effective cutoff in the Sudakov exponent. This essentially amounts to
using a scale $cw$ for infrared cutoff,
with $c\approx 1.14$, where $w$ is the inverse of the
largest distance between any two valence quarks in proton.
 Remarkably, this small
modification leads to results in good agreement with the experiment \cite{BL}.


From investigations of the proton form factor in free space, it seems that
Sudakov effects eliminate about 50 \% of the contribution from the soft
region. The Sudakov filtering in free space does something useful, but does
not seem to be sufficient to make present free-space calculations totally
reliable. The same diagrams for Sudakov effects of course occur in a
nuclear environment. In addition, there are much stronger interactions with
the nuclear target, when one goes from pure ``vacuum filtering" by Sudakov
to nuclear filtering.  We find that nuclear medium
eliminates much of the remaining 50 \% of the soft region. These are the
first full calculations of these ideas within perturbative QCD.  We find
that the main uncertainty in the nuclear calculation arises from
uncertainties in nuclear medium itself, in particular, in uncertainties in
the nuclear spectral
functions and correlations. With standard assumptions one can proceed with
the calculation essentially using zero parameters and no model dependence.
However, we find that numerical differences between models of nuclear
matter are large enough to cause significant uncertainties. Indeed,
comparison with data shows
that the uncertainties in the nuclear spectral functions and the nuclear
correlations now dominate the theoretical uncertainties, and are larger
effects than, for example, the dependence on the hadron distribution
amplitude.


\begin{figure} [t,b] \hbox{\hspace{6em}
\hbox{\psfig{figure=f1.ps,height=6cm}}} \caption{The $Q^2$ dependence of
the proton form factor $Q^4F_1$ using the KS wave function ($c=1.14$, solid
line;
$c=1$, dense-dot line) and for the CZ wave function ($c=1.14$, dashed line;
$c=1$, dotted
line). The experimental data are also shown.}
\label{fig1} \end{figure}

\begin{figure} [t,b] \hbox{\hspace{6em}
\hbox{\psfig{figure=f2.ps,height=6cm}}} \caption{The calculated pion
transparency ratio for different nuclei.} \label{fig2} \end{figure}

\section {Results and Discussions}

The results for free space proton form factor are
shown in Fig. \ref{fig1}. An important  feature of this result,
which is independent of the details of the wave function, is that it shows
scaling for $Q^2$ larger than about 10 GeV$^2$. This is a nontrivial
confirmation that $Q^2$ indeed dominates over the intrinsic momentum
$k_T^2$.

\begin{figure} [t,b] \hbox{\hspace{6em}
\hbox{\psfig{figure=f3.ps,height=6cm}}} \caption{The calculated
transparency ratio for the proton for different nuclei.
The experimental points are
taken from Ref. [19,20]. The solid curves are calculated with
$k=5$ and the dashed
curves with $k=6$.} \label{fig3}
\end{figure}


In Fig. \ref{fig2}, we  show results for color transparency for
electroproduction of pions for different nuclei using the CZ wave function.
Here we adjust the value of k, corresponding to the pion attenuation
cross-section of 25-30 mb for a pion size of about 0.8 fm. The predicted
results are shown for k=4. The precise value of $k$ might best obtained by
making a fit to the data for color transparency after it becomes available,
or perhaps by detailed comparison with diffractive calculations.  Compared
to the asymptotic wave functions, the results
for $T$ change by less than 3\% for $Q^2$ larger than 10 GeV$^2$.

\begin{figure} [t,b] \hbox{\hspace{6em}
\hbox{\psfig{figure=f4.ps,height=6cm}}} \caption{ The sensitivity of the
calculated transparency ratio to different proton wave functions.  Slight
oscillations are an artifact of the Monte Carlo integrations.  The solid curve
is calculated with the KS wave function, as in Fig. 3, and the dotted curve is
calculated with the CZ wave function; both curves use the infrared cutoff
parameter $c=1.14$. For reference,
the dashed curve shows the
result for the cutoff proposed in Ref. 18, which
amounts to setting $c=1.0$, using the KS wave function.
The calculations are shown for $A=197$.}
\label{fig4} \end{figure}

The results for the proton transparency ratio are given in Fig. \ref{fig3}.
The parameter $k$ in the attenuation cross section $\sigma=kb^2$
was chosen so as to provide a reasonable fit to the experimental data
\cite{Mak,Neill}. We find that a value of $k=6$ gives a reasonable fit.
Taking the attenuation cross section of normal protons to be 36 mb, this
corresponds to a typical $b$ of about 0.77 fm, which is a reasonable
estimate of the proton size. Since the data for $T$ is available only in
the region where the calculated free space form factor is in disagreement
with the experimental result, the value of $k$ obtained by this procedure
cannot be taken too seriously. In fact, parameter $k$ would be best
obtained by fitting to the experimental value of $T$ after it is measured
at higher energies. A reasonable range of $k$ values, which we take to be
$k=5$ and $k=6$, corresponds to $b$ values of 0.85 fm and 0.77 fm
respectively, and has been used in the figure.


We have also checked the dependence of our result on the infrared cutoff
parameter $c$ and the choice of the wave function. We find in Fig.
\ref{fig4} that the results for transparency ratio change very little if we
use the CZ wave function instead of the KS. This is a surprising result,
and one of the basis of our claim that the dominant uncertainty in
transparency ratio may be due to the nuclear model itself.


\section {Conclusion} We have reviewed the calculation of hadronic
electromagnetic form factors and color transparency using perturbative
QCD.  We find a slow rise in the transparency ratio for energies that can
be probed in the future at CEBAF and ELFE.  As discussed elsewhere
\cite{JainRalPRD,JPR} , precision experiments can discover color
transparency even with a slow rise in $Q^2$ by measuring the $A$ dependence
at fixed moderately large $Q^2$.   Due to filtering of long distance
components in the medium, the nuclear calculation is considerably cleaner
compared to the free space calculation. We also find rather remarkable
insensitivity of the transparency ratio to present theoretical
uncertainties in the perturbative QCD treatment, such as the choice of the
distribution amplitude.  To further improve the accuracy of predictions for
color transparency ratio, it is necessary to improve the modelling of
nuclear medium which now appears to be the dominant source of error.


\section * {Acknowledgements}
We thank Hsiang-nan Li for many useful discussions.  Financial support for
this work was provided by the Board
of Research in Nuclear Sciences (BRNS),
the Crafoord Foundation and the DOE grant 85ER401214.

\medskip

\begin{thebibliography}{unsrt}

\bibitem {GRF} S. J. Brodsky and G. R. Farrar, Phys. Rev. D 11, 1309 (1975).
\bibitem {GPL} S. J. Brodsky and G. P. Lepage, Phys. Rev. D 24, 2848 (1981).
\bibitem {CZ}  V. L. Chernyak and A. R. Zitnitsky, Phys. Rep. 112, 173 (1984);
Nucl. Phys. B246, 52 (1984).
\bibitem {Isg} N. Isgur and C. Llewelyn-Smith,
Phys. Rev. Lett. 52, 1080, (1984).
\bibitem {Rad} A. V. Radyushkin, Acta Phys.
Polonica, B15, 403 (1984); A. P. Bakulev and A. V. Radyushkin, Phys. Lett.
B 271,
223 (1991).
\bibitem {BrodMuel} S. J. Brodsky and A. H. Mueller, Phys.
Lett. B
206 685, (1988).
\bibitem {JPR} P. Jain, B. Pire and J. P. Ralston, Phys. Rep. 271,
67 (1996).
\bibitem {JB} J. P. Ralston and B. Pire, Phys. Rev. Lett. 61, 1823
(1988).
\bibitem {BT88} S. J. Brodsky and G. F. de Teramond, Phys. Rev. Lett.
60, 1924 (1988).
\bibitem {Car} A. S. Carroll et. al., Phys. Rev. Lett. 61,
1698
(1988).
\bibitem {JainRalPRD} P. Jain and J. P. Ralston, Phys. Rev. D
48 1104, (1993).
\bibitem {LS} H.-N. Li and G.
Sterman, Nucl. Phys. B 381, 129 (1992).
\bibitem {RP90} J. P. Ralston and B. Pire, Phys. Rev. Lett.  65,
2343 (1990).
\bibitem{stmalo} J. P. Ralston and
P. Jain, Nucl. Phys. {\bf A622}, 166c (1997).
\bibitem {LS1} H.-N. Li Phys. Rev.
D 48,
4243 (1993).
\bibitem {BL} B. Kundu, H.-N. Li, J.
Samuelsson
and P. Jain,   to be published in Euro. Phys. Journal C.
\bibitem {Bijoy99} B. Kundu, J. Samuelsson, P. Jain and J. P. Ralston,
preprint . 
\bibitem {BK} R. Jakob, P. Kroll, M. Bergmann, and N. G. Stefanis,
Z. Phys. C 66, 267 (1995).
\bibitem {Mak} N. Makins et. al, Phys. Rev. D 12, 163 (1994).
\bibitem {Neill} T. G. O ' Neill et. al, Phys. Lett. B 351, 87 (1995).
\end{thebibliography} \end{document}


% Psfig/TeX 
\def\PsfigVersion{1.9}
% dvips version
%
% All psfig/tex software, documentation, and related files
% in this distribution of psfig/tex are 
% Copyright 1987, 1988, 1991 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.
%
% *** Feel free to make local modifications of psfig as you wish,
% *** but DO NOT post any changed or modified versions of ``psfig''
% *** directly to the net. Send them to me and I'll try to incorporate
% *** them into future versions. If you want to take the psfig code 
% *** and make a new program (subject to the copyright above), distribute it, 
% *** (and maintain it) that's fine, just don't call it psfig.
%
% Bugs and improvements to trevor@media.mit.edu.
%
% Thanks to Greg Hager (GDH) and Ned Batchelder for their contributions
% to the original version of this project.
%
% Modified by J. Daniel Smith on 9 October 1990 to accept the
% %%BoundingBox: comment with or without a space after the colon.  Stole
% file reading code from Tom Rokicki's EPSF.TEX file (see below).
%
% More modifications by J. Daniel Smith on 29 March 1991 to allow the
% the included PostScript figure to be rotated.  The amount of
% rotation is specified by the "angle=" parameter of the \psfig command.
%
% Modified by Robert Russell on June 25, 1991 to allow users to specify
% .ps filenames which don't yet exist, provided they explicitly provide
% boundingbox information via the \psfig command. Note: This will only work
% if the "file=" parameter follows all four "bb???=" parameters in the
% command. This is due to the order in which psfig interprets these params.
%
%  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 TeX
%			changed \typeout to \ps@typeout
% 17 Oct 1991	JDS	added \psscalefirst and \psrotatefirst
%

% From: gvr@cs.brown.edu (George V. Reilly)
%
% \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#1	sets the path to search for the figure
%
% \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}}}
\ps@typeout{psfig/tex \PsfigVersion}

%% Here's how you define your figure path.  Should be set up with null
%% default and a user useable definition.

\def\figurepath{./}
\def\psfigurepath#1{\edef\figurepath{#1}}

%
% @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.
%
\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)
		\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 < #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 > 32767 %%% do our best to avoid overflow
	\then	\divide \count 0 by 4
		\divide \count 4 by 4
	\else	\ifnum	\count 0 < -32767
		\then	\divide \count 0 by 4
			\divide \count 4 by 4
		\else
		\fi
	\fi
	\ifnum	\count 2 > 32767 %%% while retaining reasonable accuracy
	\then	\divide \count 2 by 4
		\divide \count 4 by 4
	\else	\ifnum	\count 2 < -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 > 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 < -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
			\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@verbose
\def\@p@@sclip#1{\@cliptrue}


\newif\if@decmpr

%%% GDH 7/26/87 -- changed so that it first looks in the local directory,
%%% then in a specified global directory for the ps file.
%%% RPR 6/25/91 -- changed so that it defaults to user-supplied name if
%%% boundingbox info is specified, assuming graphic will be created by
%%% print time.
%%% TJD 10/19/91 -- added bbfile vs. file distinction, and @decmpr flag

\def\@p@@sfigure#1{\def\@p@sfile{null}\def\@p@sbbfile{null}
	        \openin1=#1.bb
		\ifeof1\closein1
	        	\openin1=\figurepath#1.bb
			\ifeof1\closein1
			        \openin1=#1
				\ifeof1\closein1%
				       \openin1=\figurepath#1
					\ifeof1
					   \ps@typeout{Error, File #1 not found}
						\if@bbllx\if@bblly
				   		\if@bburx\if@bbury
			      				\def\@p@sfile{#1}%
			      				\def\@p@sbbfile{#1}%
							\@decmprfalse
				  	   	\fi\fi\fi\fi
					\else\closein1
				    		\def\@p@sfile{\figurepath#1}%
				    		\def\@p@sbbfile{\figurepath#1}%
						\@decmprfalse
	                       		\fi%
			 	\else\closein1%
					\def\@p@sfile{#1}
					\def\@p@sbbfile{#1}
					\@decmprfalse
			 	\fi
			\else
				\def\@p@sfile{\figurepath#1}
				\def\@p@sbbfile{\figurepath#1.bb}
				\@decmprtrue
			\fi
		\else
			\def\@p@sfile{#1}
			\def\@p@sbbfile{#1.bb}
			\@decmprtrue
		\fi}

\def\@p@@sfile#1{\@p@@sfigure{#1}}

\def\@p@@sbbllx#1{
		%\ps@typeout{bbllx is #1}
		\@bbllxtrue
		\dimen100=#1
		\edef\@p@sbbllx{\number\dimen100}
}
\def\@p@@sbblly#1{
		%\ps@typeout{bblly is #1}
		\@bbllytrue
		\dimen100=#1
		\edef\@p@sbblly{\number\dimen100}
}
\def\@p@@sbburx#1{
		%\ps@typeout{bburx is #1}
		\@bburxtrue
		\dimen100=#1
		\edef\@p@sbburx{\number\dimen100}
}
\def\@p@@sbbury#1{
		%\ps@typeout{bbury is #1}
		\@bburytrue
		\dimen100=#1
		\edef\@p@sbbury{\number\dimen100}
}
\def\@p@@sheight#1{
		\@heighttrue
		\dimen100=#1
   		\edef\@p@sheight{\number\dimen100}
		%\ps@typeout{Height is \@p@sheight}
}
\def\@p@@swidth#1{
		%\ps@typeout{Width is #1}
		\@widthtrue
		\dimen100=#1
		\edef\@p@swidth{\number\dimen100}
}
\def\@p@@srheight#1{
		%\ps@typeout{Reserved height is #1}
		\@rheighttrue
		\dimen100=#1
		\edef\@p@srheight{\number\dimen100}
}
\def\@p@@srwidth#1{
		%\ps@typeout{Reserved width is #1}
		\@rwidthtrue
		\dimen100=#1
		\edef\@p@srwidth{\number\dimen100}
}
\def\@p@@sangle#1{
		%\ps@typeout{Rotation is #1}
		\@angletrue
%		\dimen100=#1
		\edef\@p@sangle{#1} %\number\dimen100}
}
\def\@p@@ssilent#1{ 
		\@verbosefalse
}
\def\@p@@sprolog#1{\@prologfiletrue\def\@prologfileval{#1}}
\def\@p@@spostlog#1{\@postlogfiletrue\def\@postlogfileval{#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
		\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,}}
%
% Compute bb height and width
%
\newif\ifno@bb
\def\bb@missing{
	\if@verbose{
		\ps@typeout{psfig: searching \@p@sbbfile \space  for bounding box}
	}\fi
	\no@bbtrue
	\epsf@getbb{\@p@sbbfile}
        \ifno@bb \else \bb@cull\epsf@llx\epsf@lly\epsf@urx\epsf@ury\fi
}	
\def\bb@cull#1#2#3#4{
	\dimen100=#1 bp\edef\@p@sbbllx{\number\dimen100}
	\dimen100=#2 bp\edef\@p@sbblly{\number\dimen100}
	\dimen100=#3 bp\edef\@p@sbburx{\number\dimen100}
	\dimen100=#4 bp\edef\@p@sbbury{\number\dimen100}
	\no@bbfalse
}
% 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
		  }}
\def\compute@bb{
		\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 \bb@missing \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
		\count203=\@p@sbburx
		\count204=\@p@sbbury
		\advance\count203 by -\@p@sbbllx
		\advance\count204 by -\@p@sbblly
		\edef\ps@bbw{\number\count203}
		\edef\ps@bbh{\number\count204}
		%\ps@typeout{ psbbh = \ps@bbh, psbbw = \ps@bbw }
		\if@angle 
			\Sine{\@p@sangle}\Cosine{\@p@sangle}
	        	{\dimen100=\maxdimen\xdef\r@p@sbbllx{\number\dimen100}
					    \xdef\r@p@sbblly{\number\dimen100}
			                    \xdef\r@p@sbburx{-\number\dimen100}
					    \xdef\r@p@sbbury{-\number\dimen100}}
%
% Need to rotate all four points and take the X-Y extremes of the new
% points as the new bounding box.
                        \def\minmaxtest{
			   \ifnum\number\p@intvaluex<\r@p@sbbllx
			      \xdef\r@p@sbbllx{\number\p@intvaluex}\fi
			   \ifnum\number\p@intvaluex>\r@p@sbburx
			      \xdef\r@p@sbburx{\number\p@intvaluex}\fi
			   \ifnum\number\p@intvaluey<\r@p@sbblly
			      \xdef\r@p@sbblly{\number\p@intvaluey}\fi
			   \ifnum\number\p@intvaluey>\r@p@sbbury
			      \xdef\r@p@sbbury{\number\p@intvaluey}\fi
			   }
%			lower left
			\rotate@{\@p@sbbllx}{\@p@sbblly}
			\minmaxtest
%			upper left
			\rotate@{\@p@sbbllx}{\@p@sbbury}
			\minmaxtest
%			lower right
			\rotate@{\@p@sbburx}{\@p@sbblly}
			\minmaxtest
%			upper right
			\rotate@{\@p@sbburx}{\@p@sbbury}
			\minmaxtest
			\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
		\count203=\@p@sbburx
		\count204=\@p@sbbury
		\advance\count203 by -\@p@sbbllx
		\advance\count204 by -\@p@sbblly
		\edef\@bbw{\number\count203}
		\edef\@bbh{\number\count204}
		%\ps@typeout{ bbh = \@bbh, bbw = \@bbw }
}
%
% \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 adjsuted 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}

%
% \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.
\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<\@psdraft{
		%
		\special{ps::[begin] 	\@p@swidth \space \@p@sheight \space
				\@p@sbbllx \space \@p@sbblly \space
				\@p@sbburx \space \@p@sbbury \space
				startTexFig \space }
		\if@angle
			\special {ps:: \@p@sangle \space rotate \space} 
		\fi
		\if@clip{
			\if@verbose{
				\ps@typeout{(clip)}
			}\fi
			\special{ps:: doclip \space }
		}\fi
		\if@prologfile
		    \special{ps: plotfile \@prologfileval \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 \@postlogfileval \space } \fi
		\special{ps::[end] endTexFig \space }
		% 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{
				\hss
			}
		\vss
		}
	}\else{
		% draft figure, just reserve the space and print the
		% path name.
		\if@draftbox{		
			% Verbose draft: print file name in box
			\hbox{\frame{\vbox to \@p@srheight sp{
			\vss
			\hbox to \@p@srwidth sp{ \hss \@p@sfile \hss }
			\vss
			}}}
		}\else{
			% Non-verbose draft
			\vbox to \@p@srheight sp{
			\vss
			\hbox to \@p@srwidth sp{\hss}
			\vss
			}
		}\fi	



	}\fi
}}
\psfigRestoreAt
\let\@=\LaTeXAtSign

