An Introduction to Lattice QCD
Extracted source text ยท arXiv hep-ph/9504271
%Paper: hep-ph/9504271
%From: pene@qcd.th.u-psud.fr (pene)
%Date: Mon, 10 Apr 1995 18:28:28 +0100
\documentstyle[12pt]{article}
\textwidth 17.0cm
\textheight 25.0cm
\oddsidemargin -0.25 cm
\topmargin -1.5cm
\setlength{\parindent}{1cm}
\pagestyle{empty}
%\parsep 6pt plus 1pt minus 1pt
%\parindent 12mm
\def\be{\begin{equation}}
\def\ee{\end{equation}}
\def\bea{\begin{eqnarray}}
\def\eea{\end{eqnarray}}
\def\len{\lefteqn}
\def\nn{\nonumber}
\def\mev{{\rm MeV}}
\def\gev{{\rm GeV}}
\def\noi{\noindent}
\begin{document}
\begin{flushright}
LPTHE-Orsay 95/28,\\
hep-ph/9504271
\end{flushright}
\begin{center}
{\large \bf An Introduction to Lattice QCD.}
\vskip 4.0ex
{\large Olivier P\`ene}
\vskip 1.5ex
Laboratoire de Physique Th\'eorique et Hautes Energies\footnote{Laboratoire
associ\'e au
Centre National de la Recherche Scientifique - URA 63}\\
{Universit\'e de Paris XI, B\^atiment 211, 91405 Orsay Cedex, France}\\
\vskip 3.5ex
{\large Talk delivered at the Journ\'ees sur les projets} \\
{\large de Physique Hadronique, Soci\'et\'e Fran\c caise de Physique,}\\
{Super-Besse (France), 12-14 janvier 1995} \\
\vskip 4.5ex
{\bf R\'esum\'e.}
\vskip 0.3cm
\parbox{15cm}{\baselineskip 1 ex\small
La m\'ethode de calcul de QCD sur r\'eseaux est le seul moyen
de calcul non perturbatif fond\'e uniquement sur les bases de QCD.
Apr\`es une introduction tr\`es simple aux principes de QCD sur r\'eseaux, j'en
discute les limites actuelles et la nature des processus qui lui sont
accessibles. Je pr\'esente ensuite quelques r\'esultats frappants dans les
domaines des quarks l\'egers et des quarks lourds. Enfin je tente de deviner
les perspectives d'avenir.}
\end{center}
\vskip 0.5 cm
\begin{abstract}\noindent
Lattice QCD is the only non-perturbative method based uniquely on the first
principles of QCD. After a very simple introduction to the principles of
lattice QCD,
I discuss its present limitations and the type of processes it can deal with.
Then I present some striking results in the light and heavy quarks sectors.
Finally I try to guess the prospects.
\end{abstract}
\section{Introduction.}
Let us start with a strong statement. Lattice QCD is within our present
knowledge
{\it the non-perturbative method to solve QCD}. It needs no additional
assumption beyond QCD,
it has exactly as many free parameters as QCD itself, that is a coupling
constant, or equivalently an energy scale ($\Lambda_{QCD}$ for example), and
one mass per quark species.
However, there is a price to pay for this achievement: first, in the proper
sense of a price, one needs a huge amount of computer time to reach only a
limited precision. Second, only the simplest processes may be studied by this
method, mainly those implying no more than one ground state hadron at a time,
and in a limited region of the masses and momenta as we shall see. Still the
improvements are fast, theoretical improvements and numerical ones. The lattice
community is steadily stepping toward Teraflop machines,
dedicated computer are used all over the world (but not in France), and we may
cherish great hopes.
The principle of the method is to discretize space-time, and to work in the
Lagrangian formalism, in a finite volume. Hamiltonian methods with a
discretized space and a continuous time have also been tried, but they did not
achieve by far the same successes and I will skip them.
Several analytic methods are available on the lattice, weak coupling
(perturbative) expansions, strong coupling expansions, mean field
approximations, but numerical simulations \`a la Monte-Carlo are by far the
most fruitful, allowing to fill the gap between the strong and weak coupling
regimes.
Numerical simulations on lattice QCD allows you to address almost any question
about confinement: you may study pure Yang-Mills QCD (i.e. QCD without quarks)
and the glueball spectrum, you may study at finite temperature the deconfining
phase transition as well as the chiral one, you may compute the potential
between static quarks, the running coupling constant starting from
non-perturbative data (and this compares quite well with direct perturbative
estimates), you may learn about the QCD vacuum, its topological properties, its
condensates, about the theoretical mechanism of confinement (for example you
may test the dual Meissner effect picture), you may compute the parameters of
the chiral Lagrangians, etc. I will here concentrate on a few topics directly
related to important experimental data: computation of masses, structure
functions, and electroweak matrix elements. This limited domain is still quite
wide as we shall see.
In section \ref{sec-act}. I will describe the principles of the lattice
calculations, the standard actions, the use of path integrals, the Euclidean
analytic continuation and the Monte-Carlo method. In section \ref{sec-lim}. I
will summarize and discuss the practical limitations of the method. In section
\ref{sec-light}. I will present some striking and phenomenologically relevant
results about light quarks. In section \ref{sec-heavy}. I will present the same
about heavy quarks. I will then conclude and try to anticipate future progress.
\section{The principles and the computational method in short.}
\label{sec-act}
\subsection{The pure gauge lattice action.}
Space and time are assumed to be discretized in an hypercubic lattice. It is
usual to call $a$ the lattice spacing. Let us consider all the oriented links
of the lattice. A gauge field configuration is described by a set of $SU(3)$
matrices labelled by the oriented links. The relation between these $SU(3)$
matrices and the usual continuum gauge field is:
\be U_{\mu}(x)=P\left\{e^{i a g_0\int_{0}^{1}d\tau A_\mu^i(x+\tau a\hat\mu)
\frac{\lambda_i}2}\right\}\label{umu}\ee
where $U_{\mu}(x)$ is the $SU(3)$ matrix attached to the link starting from the
site $x$ and going to the site $x+a\hat \mu, (\mu=0,3)$. $g_0$ is the bare
coupling constant, $\hat\mu$ is the unity vector in the positive $\mu$
direction, $i$ is a color index and $\lambda_i, (i=1,8)$ are the so-called
``Gell-Mann'' Hermitean traceless $3\times 3$ complex matrices. $P$ means a
path ordered product. To the same link, oriented in the opposite direction,
corresponds the inverse matrix:
\be U_{-\mu}(x+a\hat\mu) = U_{\mu}^{-1}(x).\ee
A gauge transformation is represented by an arbitrary set of $SU(3)$ matrices
labelled by the sites of the lattice, $g(x)$, and acts as:
\be U_{\mu}(x)\to g(x)U_{\mu}(x)g^{-1}(x+a\hat\mu) \ee
A plaquette is an elementary square composed by four adjacent links, to
which is attached the following $SU(3)$ matrix:
\be
P(x)_{\mu,\nu}=U_{\mu}(x)U_{\nu}(x+a\hat\mu)U_{\mu}^{-1}(x+a\hat\nu)
U_{\nu}^{-1}(x)\label{pla}
\ee
the trace of which is gauge invariant as it is easy to check. Consequently the
simplest pure gauge lattice action \cite{wi} is:
\def\arto{ {\,\,\lower .8ex\hbox {$\longrightarrow
\atop a \rightarrow 0$}\,\,}}
\bea S[{\cal U}]=-\sum_{x,\mu,\nu}g_{\mu\nu}\frac 2 {g^2} \,\mathrm{Re}
\left\{\mathrm{Tr}\left [1-P(x)_{\mu,\nu}
\right] \right\}\nn\\
\arto -\frac 1 4 \sum_{i,\mu,\nu}\int d^4x G^i_{\mu\nu}(x)G_i^{\mu\nu}(x),\quad
(i=1,8).\label{s}\eea
for any gauge configuration ${\cal U}$, where a gauge configuration is defined
as the set $U_{\mu}(x), \forall (x,\mu)$.
There exists a large number of alternative gauge invariant lattice action which
have the same limit when $a\to 0$ as the action in (\ref{s}). For a recent
summary of the tentative improvements, see \cite{has}.
\subsection{Path integrals.}
A field theory is solved once one knows how to compute all Green functions
\footnote{ Later on, I will give an example showing how to extract physical
quantities from Green function.}. The most elegant way to compute Green
functions, which is used in lattice QCD, is through path integrals. A Green
function, i.e. the T-product
of several operators, is given for example by:
\be<T[{\cal O}(x){\cal O}'(y)]>=\frac {{\displaystyle\int \prod_{x,\mu,\nu}}
dU(x)_{\mu\nu} \,e^{iS[{\cal U}]}{\cal O}(x){\cal O}'(y)}{{\displaystyle\int
\prod_{x,\mu,\nu}}dU(x)_{\mu\nu} \,e^{iS[{\cal U}]}}\label{two}\ee
where ${\cal O}(x)$ and ${\cal O}'(y)$ are operators of the theory, say local
polynomials of the elementary fields, $S[{\cal U}]$ is the action defined in
(\ref{s}) and $dU(x)$ is a gauge invariant integration measure on the $SU(3)$
group. The denominator insures the normalization. In (\ref{two}) there is a
T-product of two operators, commonly called a two-point correlation function.
The generalization to n-point correlation functions is straightforward.
It is important to notice the essential simplification provided by lattice
discretization and finite volume: the number of integration variables in
(\ref{two}) is finite, while in the continuum theory, the path integral is
defined in terms of an infinite number of variables with the cardinality of the
continuum!
Still the integral in (\ref{two}) has a huge number of integration variables:
one $SU(3)$ matrix per link, i.e. in practice many millions of variables.
This makes the integral very difficult to compute, all the more so since the
exponential $e^{iS[\{U\}]}$ oscillates very fast. The method used to solve the
latter problem is to perform an Euclidean analytic continuation.
\subsection{Euclidean analytic continuation.}
This consists in continuing the time variable in the complex plane, and using
as variables the imaginary parts: $x_4=ix_0, p_4=ip_0$. The Euclidean
continuation of the two-point correlation function in (\ref{two}) is given by:
\be \frac {{\displaystyle\int \prod_{x,\mu,\nu}} dU(x)_{\mu\nu} \,e^{-S[{\cal
U}]}{\cal O}(x){\cal O}'(y)}{{\displaystyle\int
\prod_{x,\mu,\nu}}dU(x)_{\mu\nu} \,e^{-S[{\cal U}]}}\label{twoeuc}\ee
where
\bea S[{\cal U}]=\sum_{x,\mu,\nu}\frac 2 {g^2} \,\mathrm{Re}
\left\{\mathrm{Tr}\left [1-P(x)_{\mu,\nu}
\right] \right\}\ge 0\nn\\ \nn
\arto \frac 1 4 \sum_{i=1,8}\int d^4x \left(G^i_{\mu\nu}(x)\right)^2\ge
0\label{seuc}\eea
This formula allows a numerical computation as we shall see in the next
subsection, thanks to the disappearance of the $e^{iS[\{U\}]}$ oscillations.
Before turning to that, it is important to stress here that once having
computed (\ref{twoeuc}), an analytic continuation back to the Minkowskian time
will be necessary. This is straightforward in the simple cases as we shall see,
but for systems with more than one hadron at the same time the latter analytic
continuation far off in the complex plane is practically impossible with the
presently known methods. This implies that {\it lattice-QCD Monte-Carlo
simulations are nowadays restricted to physical processes with no more than
one hadron at one time,} except close to the threshold \cite{maiani}.
\subsection{Monte-Carlo.}
\label{mc}
The crucial remark is that the positivity of $S[{\cal U}]$ in (\ref{seuc})
gives to $e^{-S[{\cal U}]}$ the meaning of a probability distribution, properly
normalized by the denominator in (\ref{twoeuc}), and (\ref{twoeuc}) is simply
the formula for a mean value in a probabilistic sense. This suggests an analogy
with statistical physics in four dimension which has been extensively used to
reach a deeper understanding of Euclidean QCD. I will skip this and simply
notice that although the probabilistic ensemble in (\ref{twoeuc}) is the huge
ensemble of Euclidean gauge configurations, most of them contribute for an
exponentially suppressed amount. Creutz \cite{creutz} suggested to use an
algorithm that selects at random gauge configurations according to the
probability law $e^{-S[{\cal U}]}/Z$ ($Z$ being the denominator in
(\ref{twoeuc})). Such an algorithm will discard automatically the
configurations whose contribution is negligible. Once a large number $N$ of
uncorrelated configurations has been produced by the algorithm, the result is
\be\frac {{\displaystyle\int \prod_{x,\mu,\nu}} dU(x)_{\mu\nu} \,e^{-S}{\cal
O}(x){\cal O}'(y)}{{\displaystyle\int \prod_{x,\mu,\nu}}dU(x)_{\mu\nu}
\,e^{-S}}
= \frac 1 N\sum_{n=1,N} {\cal O}_n(x){\cal O}'_n(y) +O\left(\frac 1
{\sqrt{N}}\right)\ee
where ${\cal O}_n(x)$ is the operator ${\cal O}(x)$ with the values of the
fields in the $n^{\mathrm {th}}$ gauge configuration.
Of course, many different algorithms may be used, improved, tested, and an
intense
activity is going on on this issue.
Although the computational task is still a formidable one, that needs hundred's
of hours on supercomputers, it is already a fantastic achievement that this
method has
proven to be practically doable and to lead to non-perturbative predictions
that agree quite well with experiment, within its rather poor numerical
accuracy: $O(1/\sqrt{N})$.
\subsection{The quark actions.}
Up to now we have considered QCD with only gauge fields. What about quarks ?
Quark fields are located on lattice sites, and look quite like continuum quark
fields except for a different normalization: four spin and three color
components.
The naive action that one is tempted to use for quarks on the lattice is:
\be S_{quarks}=\displaystyle\sum_x\left\{\frac 1 {2a}\left[ \overline q(x) (
-\gamma_\mu)
U_\mu(x) q(x+a\hat \mu) + (\hat \mu \to -\hat\mu, U_\mu \to U_\mu^{-1})\right]
+\overline q(x) m q(x) \right\}\label{quark} \ee
whose formal limit when $a\to 0$ is the standard continuum QCD quark action and
which is gauge invariant as well as chiral invariant when $m=0$.
However, this naive action is not satisfactory because it encounters the
``doubling problem''. The point is that for one species of quark in
(\ref{quark}), the quark spectrum has 16 quarks in the continuum limit $a\to
0$. I have no time to explain why this comes out, let us simply state that it
has to do with the periodicity of the lattice spectrum. Many proposals have
been elaborated to solve this problem \cite{quark}. Wilson's \cite{wi} proposal
is simple to explain:
replace the action (\ref{quark}) by
\be S_{quarks}=\displaystyle\sum_x\left\{\frac 1 {2a} \sum_\mu\left[\overline
q(x) (r -\gamma_\mu)
U(x)_\mu q(x+a\hat \mu) +(\hat \mu \to -\hat\mu, U_\mu \to U_\mu^{-1})\right]
+\overline q(x) (m+\frac r a )q(x) \right\}\label{quarkw} \ee
The effect of the additional terms proportional to $r$ is to yield a mass
$O(r/a)$ to the 15 doublers, leaving only one quark with finite mass when $a\to
0$, as wished.
Other quark actions that improve the $a\to 0$ limit are under study
\cite{impr}.
It should now be clear to the reader that many lattice actions have been
proposed or may be proposed for the gauge fields and many for the quark fields,
leaving aside the many calculational algorithms.
All these aim at the same theory, QCD. Indeed lattice QCD may be viewed as a
class of QCD regularization scheme. Discretization cuts off the ultraviolet
singularities. The different actions are different regularization schemes.
Furthermore any regularization procedure of a field theory has to be
complemented by a renormalization scheme. I will not enter here into a
description of the subtle question of lattice renormalization. This is also a
very ative field of research \cite{carla}.
Clearly, all regularization and renormalization schemes must give the same
physical quantities when $a\to 0$ and the volume goes to infinity. However, due
to the numerical uncertainties and to the finite value used for $a$ and the
volume, these different methods do indeed differ somehow in their physical
predictions. These differences are taken as a tool to estimate the systematic
errors due to finite $a$, finite volume, etc. The statistical errors due to the
finite number of gauge configurations used in the Monte-Carlo may be estimated
from the Monte-Carlo itself under some assumptions about the probability
distribution of the quantities in question. Let us repeat, these different
actions and different renormalization schemes are not at all different models,
neither do they preclude to the rigor and universality of the calculations
performed. The are simply different equivalent regularization/renormalization
schemes for QCD.
\subsection{An example: computation of a pseudoscalar meson mass and of
$f_\pi$.}
\label{fpi}
Before leaving this section, let us consider in short how one computes a
physical quantity on a simple example. The axial-current two-point correlation
function in Euclidean continuation verifies:
\bea \displaystyle \int d\vec x<(\overline q(0)\gamma_0 \gamma_5 q(0))\,\,
(\overline q(\vec x, x_4)\gamma_0 \gamma_5 q(\vec x, x_4))\nn \\
= \displaystyle \sum_n |<0|q(0)\gamma_0 \gamma_5 q(0)|n>|^2 \,\,\frac {e^{-m_n
x_4}}
{2 m_n}\nn \\
{\,\,\lower .8ex\hbox {$\simeq \atop \scriptscriptstyle {x_4 \rightarrow
\infty}$\,\,}}|<0|q(0)\gamma_0 \gamma_5 q(0)|\pi>|^2 \,\,\frac {e^{-m_\pi x_4}}
{2 m_\pi}\nn
\\ \simeq f_\pi^2 \frac {m_\pi} 2\,\, e^{-m_\pi x_4}\label{amu}\eea
where the Euclidean continuation has turned the well known Minkowskian
$e^{-iEx_0}$ time dependence to the $e^{-E x_4}$ exponential decay. The sum
$\sum_n$ is a sum over a complete set in the Hilbert space that is coupled to
the vacuum by the axial current. At large time, thanks to the exponential
decay, the lightest state dominates the sum. I call the latter state $\pi$ but
it can as well be a $K$, a $D$ etc., depending on the mass of the quarks, or
even, as we shall extensively use later on, a fictitious pseudoscalar meson
with quark masses that do not exist in nature.
The two-point correlation function in (\ref{amu}) may be computed by the
Monte-Carlo method described in subsection \ref{mc}. Once the calculation
performed, the large $x_4$ exponential slope gives the mass $m_\pi$, and once
the latter is measured, the prefactor provides an estimate of the leptonic
decay constant $f_\pi$ (renormalization introduces here a couple of subtleties
which are unessential here and that I will skip). An obvious limitation of this
method is that the signals produced by the excited states are difficult to
extract from the statistical noise of the dominant ground state: only the
ground states are reachable with a suitable statistics, except in the NRQCD
that will be shortly alluded to in section \ref{sec-heavy}.
\section{The limitations.}
\label{sec-lim}
If it is fair to say that lattice QCD is a rigorous non-perturbative method, it
is also necessary to insist on its practical limitations nowadays.
\subsection{The quenched approximation.}
The quark action (\ref{quarkw}) is quadratic in the quark fields as in the
continuum, and hence, as one can read in the text books, the integration of the
fermionic variables in the path integral ends up in the ``fermionic
determinant'' which is a complicated non-local effective action depending only
on the gauge fields. In a simpler language, the integration of the fermionic
variables amounts to compute the dynamical quark loops (i.e. the quark loops
generated from the gluons) and the result is a non-local interaction between
the gluons. On principle there is no obstacle in performing this calculation on
the lattice and completing to the end the program described in the preceeding
section. Not only is there no obstacle of principle, but it is currently done
by several groups. However, these dynamical quark loops increase by several
orders of magnitude the computation time and increase a lot the difficulty. And
this grows even worst for larger lattices since the computation time increases
like $\propto n^{4/3}$ instead of $\propto n$ for a pure gauge theory, $n$
being the number of lattice sites.
It results that for every calculation which demands a rather large number of
lattice sites,
a popular, although unjustified, approximation is performed: the quenched
approximation. It simply amounts to replace the fermion determinant by 1, or in
other words to eliminate all dynamical fermion loops such as the following one
\input pstricks
\input pst-coil.sty
\vspace*{3cm}
\psellipse[linewidth=1pt](7,0.)(2, 1.0)
\pscoil[coilarm=0,linewidth=1pt,coilwidth=0.3](8.,0.8)(10,3)
\pscoil[coilarm=0,linewidth=1pt,coilwidth=0.3](6.2,-0.8)(6,3)
\pscoil[coilarm=0,linewidth=1pt,coilwidth=0.3](6.2,2.)(9,2)
\pscoil[coilarm=0,linewidth=1pt,coilwidth=0.3](3,0)(5,0)
\vskip 1.5cm
This does not mean that quarks do not propagate. In the example of section
\ref{fpi}, the axial current creates/annihilates valence quarks. The latter are
fully incorporated in the calculation which may be pictured as incorporating
the whole set of diagrams with any number of gluon lines such as this one:
\vspace*{0.5cm}
\psellipse[linewidth=1pt](7,0.)(2, 1.0)
\psline[linewidth=1pt](4.8,0)(5,0)
\psline[linewidth=1pt](9,0)(9.2,0)
\pscoil[coilarm=0,linewidth=1pt,coilwidth=0.3](8.,0.8)(7,-1)
\pscoil[coilarm=0,linewidth=1pt,coilwidth=0.3](5.,0)(7.5,0)
\vskip 2.5cm
\noindent where the lines at the ends represent the insertion of the axial
current.
The quenched approximation has proven to be quite satisfactory in all processes
which are dominated by valence quarks. Reversely this approximation has to be
avoided whenever the sea quarks dominate, and close to the chiral limit when
the pion loops (the so-called ``chiral loops'') become important. Indeed it
has been shown \cite{sharpe} that the chiral limit is singular in the quenched
theory:
\be m_\pi^2 \propto m_q\left[1-2 \delta \ln\left(\frac
{m_\pi}{\Lambda}\right)+...\right]\label{que}\ee
instead of
\be m_\pi^2\propto m_q\left[1 + O\left(m^2_\pi \ln (m_\pi)\right)
+...\right]\label{chi}\ee
in the exact theory.
\subsection{Limitations on masses and momenta.}
\label{lim}
To make it more concrete, the typical values of the lattice spacing practically
used are
$a\sim 0.05-0.1$ fm, i.e. $a^{-1} \sim 2-4$ GeV.
The spatial length of the lattice is $L\sim 1-2$ fm; i.e. $L^{-1} \sim 100-200
$ MeV.
To reach meaningful results, the calculation has to be performed with a set of
parameters such that
$L^{-1} \ll m \ll a^{-1}$. Indeed, $a^{-1}$ is the ultraviolet cut-off of the
lattice, and $L^{-1}$ is in some sense an infrared cut-off. A computation
performed with masses of the order of $a^{-1}$ contains systematic errors that
are totally out of control.
Consequently, calculations may be performed with quark masses ranging from
$\sim 50$ MeV ($m_\pi \sim 400$ MeV) to $\sim 2.5$ GeV. This means that only
$s$ and $c$ quarks may be {\it directly} considered on a lattice. To study
quarks $u, d, b$ some kind of extrapolation will be needed.
The momenta have also to be kept smaller than the ultraviolet cut-off.
Furthermore due to finite volume
and periodic boundary conditions, only a discrete set of values are possible
for the momenta:
\be p_i=\frac{2\pi n} L, \qquad (2\pi/ L\sim 0.6-1.\mathrm{GeV})\ee
Consequently, for light quarks, no momentum transfer larger than $5-10$ GeV$^2$
may be studied, and only a few discrete points are measured in the available
domain.
\section{The light quarks.}
\label{sec-light}
\subsection{The chiral limit.}
We have seen in the preceeding section that it is impossible to put $u$ and $d$
quarks
on the presently available lattices. One then performs an extrapolation from
quarks whose masses range down as close as possible to the chiral limit. In
this process one uses, and simulataneously one checks, the chiral theory, i.e.
the theory of spontaneous breaking of chiral symmetry.
For example, in the case of wilson fermions (\ref{quarkw}), one {\it defines}
massless quarks (the chiral limit) as the quarks that combine into a massless
pseudoscalar meson, a Goldstone boson (the way to measure the pseudoscalar mass
has been sketched in section \ref{fpi}). Notice that the parameter $m$ in eq.
(\ref{quarkw}) is the quark {\it bare mass}. It is {\it not} a zero quark bare
mass that corresponds to massless renormalized quarks, i.e. to a massless
pseudoscalar Goldstone boson. Indeed Wilson's regularization procedure
(\ref{quarkw}) breaks chiral invariance and non trivial counter-terms are
needed to restore chiral symmetry in the renormalization procedure. This
strategy, of using a Monte-Carlo calculation to fit the bare quark mass that
corresponds to the chiral limit, is a standard example of {\it non-perturbative
renormalization of the mass}.
%___________________________________________________________________________
\begin{figure}[t] % produce figure here
\begin{center} \setlength{\unitlength}{1truecm} \begin{picture}(6.0,6.0)
\put(-4.0,-4.0){\special{psfile=quench.ps}}
\end{picture}
\vskip 1.5 cm
Fig. 1: The plot $\ln (m_\pi^2/m_q)$ in the quenched approximation, taken from
\cite{gupta} and \cite{sharpe}, shows the $\delta$ singularity.
\end{center}
\end{figure}
%------------------------------------------------
A recent study of the chiral limit in the quenched approximation \cite{kim}
exhibits
the effect of the quenching approximation. Fig. 1 is taken from \cite{gupta},
\cite{sharpe}: it plots $m^2_\pi$ as a function of $m_q$. The points to the
right of the plot show a nice flat behaviour as expected from chiral theory
(\ref{chi}), while the points to the left show the effect of the $\delta$
singularity due to quenching
(\ref{que}). One learns from this plot that quenching becomes really misleading
for quark masses below about one half of $m_s$. On the other hand, the linear
extrapolation from masses above $m_s/2$ seems to be compatible with the chiral
theory, and in fair agreement with experiment: paradoxically, within the
quenched approximation, it seems better to study the chiral limit by
extrapolating from not too light quarks. This restricts of course the expected
accuracy.
\subsection{$f_\pi/m_\rho$}
One physical scale is necessary to renormalize lattice QCD in the chiral limit.
This is necessary to fix the scale of the lattice spacing $a$. Indeed, in
massless QCD there is one free scale, usually referred to as $\Lambda_{QCD}$ in
perturbation theory. Hence, lattice calculations can only predict ratios of
chiral quantities. For example the ratio $f_\pi/m_\rho$ (in practice $u$ and
$d$ quarks can be considered as massless within the present accuracy) has been
studied \cite{wein} in the quenched approximation with high statistics, and the
results are reported in table 1.
\vskip 0.5 cm
\begin{table}
\begin{center}
\begin{tabular}{|c|c|c|c|}\hline
decay & finite volume & inf. volume& exp. \\ \hline
$f_\pi/m_\rho$ & 0.106(9)& 0.106(14) & 0.121 \\
$f_K/m_\rho$ & 0.121(6)& 0.123(9) & 0.148 \\
$F_\rho/m_\rho$ & 0.177(21)& 0.173(29) & 0.199 \\
$F_\phi/m_\rho$ & 0.217(19)& 0.253(35) & 0.219 \\ \hline
\end{tabular}
\vskip 1.5 cm
\caption{Light quarks decay constants scaled to the $\rho$ mass.}
\end{center}
\end{table}
As can be seen, within errors, the quenched lattice agree with
experiment (except for $f_K$) with a tendency to lie below experiment
(except for $F_\phi$). Whether this tendency is a systematic quenching effect
is not yet known.
\subsection{$m_N/m_\rho$.}
The $m_N/m_\rho$ is another ratio concerning light quarks that lattice compute
and that can be compared with experiment. The first calculations
have found a ratio around 1.4-1.5 against an experimental number of 1.20.
It is now understood that this was simply due to the fact that the quark masses
where too heavy in the calculations, for the reasons explained in the section
\ref{lim}.
The High Energy Monte-Carlo Grand Challenge (HEMCG) has performed an {\it
unquenched} calculation \cite{hemcg}, i.e. including the quark loops, of
$m_N/m_\rho$ as a function of $m_\pi/m_\rho$, that we report in fig. 2. There
is an indication that $m_N/m_\rho$ does indeed decrease when $m_\pi/m_\rho$
decreases, and the lattice results seem to point toward the experimental point
represented on the plot by a question mark. The quenched results \cite{kim2}
are not significantly different from the unquenched ones, they confirm the
agreement with experiment down to lower values of $m_\pi/m_\rho$.
%___________________________________________________________________________
\begin{figure}[t] % produce figure here
\begin{center} \setlength{\unitlength}{1truecm} \begin{picture}(6.0,6.0)
\put(-3.0,-4.0){\special{psfile=mnmp.ps}}
\end{picture} %\end{center}
\vskip 3 cm
Fig. 2: $m_N/m_\rho$ as a function of $m_\pi/m_\rho$, as computed with
dynamical quarks (unquenched) by the HEMCG collaboration.
\end{center}
\end{figure}
%------------------------------------------------
\subsection{Structure functions.}
Structure functions are important hadronic quantities about which lattice
may say a word. One usually defines the $n^{\mathrm {th}}$ moment by:
\be \frac 2 {Q_f^2}\displaystyle\int dx x^n F_1(x,q^2) =
\frac 1 {Q_f^2}\displaystyle\int dx x^{n-1} F_2(x,q^2)\equiv <x^n>\ee
the equality being valid for $q^2 \to \infty$.
Lattice calculations have been performed for the lowest momenta some time ago
\cite{guido} and seem to be confirmed by recent ones \cite{goker} which use
lower quark masses. The latter find:
\bea <x_u> = 0.42(4);& \qquad [exp: 0.28]\nn\\ <x_d>=0.18(2);& \qquad [exp:
0.11]\nn\\ <x^2_u> = 0.12(2);& \qquad [exp: 0.08]\nn\\<x^2_d>=0.050(8);&
\qquad [exp: 0.03]\nn \eea
where $[exp]$ refers to the valence quark momenta fitted by \cite{martin}.
It is not clear to me whether the quenching approximation may be
blamed for this discrepancy.
\section{The heavy quarks.}
\label{sec-heavy}
We have seen very few of the many lattice results about light quark physics,
the preferred field for the project ELFE. Let us now turn to the realm of a
$\tau$-charm factory, namely heavy flavor physics. Lattice calculations have
provided a lot of results concerning masses, leptonic decay constants and
semileptonic decay form factors. Notice that nonleptonic decays are out of
reach because they include more than one hadron in the final state
\cite{maiani}. The spectroscopy of heavy quarkonia is also extensively studied
including some excitated states \cite{shige}.
\subsection{The charm.}
\begin{table}
\begin{center}
\begin{tabular}{|c|c|c|c|}\hline
& $f_D$ (MeV)& $f_{D_s}$ (MeV) & $f_{D_s}/f_D$ \\ \hline
BLS &$208\pm9\pm37 $&$ 230 \pm 7\pm35$&$ 1.11\pm.02\pm.05$\\
UKQCD & $185^{+4+42}_{-3-7} $&$ 212^{+4+46}_{-4-7}$&$ 1.18 \pm 0.02$\\
PWCD & $170\pm30 $& &$ 1.09\pm.02\pm.05$\\
APE & $218\pm9$&$240\pm9$&$1.11\pm.01$ \\
ELC & $210\pm15$&$227\pm15$&$1.08\pm.02$ \\
LANL & $241\pm19$&$266\pm15$& \\
HEMCGC & $215\pm5\pm53$&$288\pm5\pm63$& \\ \hline
Exp. & & &\\ \hline
WA75 & &$232\pm 45\pm 52 $&\\
CLEO & & $344\pm37\pm67 $&\\
BES & & $434^{+153+35}_{-133-33}$&\\ \hline
\end{tabular}
\vskip 0.3cm
\caption{$D_{(s)}$ leptonic decay constants from different groups, compared to
experiment (in this convention: $f_\pi= 132$ MeV).}
\end{center}
\end{table}
%---------------------------------------
Table 2, taken from \cite{asmaa}, reports the leptonic decay constant for
charmed mesons. As can be seen, the different lattice predictions agree quite
well with one another as well as with experiment within the large present
experimental errors. Notice the unquenched HEMCGC results, which also agree
with the quenched ones within their expected larger errors. As may be seen, the
lattice have an accuracy of around 10-15 \% for $f_D$ and $f_{D_s}$ which were
predicted at a time where no experimental data was available. In the high
statistics calculations, the statistical error is as small as 5 \%, the
systematic errors being larger, as estimated by the authors themselves, or as
indicated by the discrepancy between different groups\footnote{Different
analysis methods may be used, that should agree in the continuum limit. Their
difference for finite lattice spacing and finite volume gives an estimate of
the systematic errors. This comparison is sometimes done inside one
collaboration, but it can also be extracted from the comparison of different
collaboration's results.}.
%----------------------------------------
\begin{table}
\begin{center}
\begin{tabular}{|c|c|c|c|c|}\hline
& $f_+(0)$ & $V(0)$ & $A_1(0)$ & $A_2(0)$ \\ \hline
BKS &$0.90(8)(21) $&$ 1.43(45)(49)$&$ 0.83(14)(28)$&$ 0.59(14)(24)$\\
UKQCD & $0.67^{+.07}_{-.08} $& $0.98^{+.10}_{-.13} $& $0.70^{+.07}_{-.10} $&
$0.68^{+.11}_{-.17} $\\
APE & $0.72(9)$&$1.00(20)$&$0.64(11)$&$0.46(34)$ \\
ELC & $0.60(15)(7)$&$0.86(24)$&$0.64(16)$&$0.40(28)(4)$ \\
LANL & $0.73(6)$&$1.24(8)$&$0.66(3)$&$0.45(19)$ \\
\hline
Exp. & & & &\\
(average)& $0.77(4)$&$1.16(16)$&$0.61(5)$&$0.45(9)$ \\ \hline
\end{tabular}
\vskip 0.3cm
\caption{
$D\to K^{(\ast)}$ semileptonic form factors at $q^2=0$ from different lattice
groups, compared to experiment.}
\end{center}
\end{table}
%----------------------------------------------
In table 3, the semileptonic form factors for $D$ decays are quoted again from
\cite{asmaa}. The experimental average are quoted from \cite{witherell}. Again
the comparison with experiment is quite satisfactory for $f_+$ and $A_1$,
satisfactory for $V$, while $A_2$ does not show a discrepancy within larger
experimental and theoretical errors.
As we have already mentioned, the finite volume lattices can only give a few
points in momentum space. Practically, for $D$ semileptonic decay, in most
cases only two points are in the physical $q^2$ domain. Luckily, however, the
masses of $D$ and $K$ are such that these two points turn out to be at
$q^2_{maximum}$ and close to $q^2=0$, that is they bracket the physical domain,
thus limiting additional errors that would have resulted from an
extrapolation.
It is now clear that lattice methods are in a good position to give their best
in this domain of $D$ and $D_s$ (semi)leptonic decays. Indeed, as already
stressed, $c$ and $s$ quarks are in the mass range that is easy to deal with on
the lattice, and we have just seen that the $q^2$ physical domain is well
accessed.
It is useful to stress that a better experimental accuracy for these numbers,
and particularly leptonic decay constants, from a $\tau$-charm factory or any
other source, would be extremely useful to check really the precision achieved
by lattice methods.
%___________________________________________________________________________
\begin{figure}[t] % produce figure here
\begin{center} \setlength{\unitlength}{1truecm} \begin{picture}(6.0,6.0)
\put(-3.0,-8.0){\special{psfile=fb_courbe.ps}}
\end{picture} %\end{center}
\vskip 3 cm
Fig. 3: $f_PM_P^{1/2}$ from \cite{elc}. The two points at the extreme left are
static quarks. The points to the right correspond to moving quarks. They are in
the region of the $D$ meson. All points agree. The vertical line corresponds to
the $B$ meson. The slope of the fit indicates the size of non-leading,
$O(1/M_P)$, corrections to HQET.
\end{center}
\end{figure}
%------------------------------------------------
\subsection{Extrapolation to beauty.}
The $b$ quark is too heavy to be directly studied on present lattices, since
$m_b > a^{-1}$. It is thus necessary to resort to an extrapolation. Similarly
to the light quark case, where one uses {\it and} checks the chiral theory, one
uses {\it and} checks the Heavy Quark Effective Theory (HQET) when dealing with
heavy quarks. An example is provided in fig. 3, taken from \cite{elc}. HQET
predicts a finite limit of $f_PM_P^{1/2}$, up to logarithms, for a heavy-light
pseudoscalar meson $P$ the mass of which $M_P\to \infty$. The two points at the
extreme left in fig. 3 corresponds to a direct calculation for infinite quark
mass, according to a method proposed by Eichten \cite{eichten} which uses {\it
static} quarks and was one of the historical starting points of HQET. The
errors on these points are rather large. The other points correspond to finite
mass, {\it moving} quarks really computed on the lattice, i.e. to quarks in the
charm region with masses ranging up to 2.5 GeV. It appears clearly from the
plot that all the results are consistent, and that they show that $O(1/M_P)$
corrections to the asymptotic limit are sizeable (the slope of the straight
line). The $O(1/M_P^2)$ corrections are estimated from the curvature of the
parabola. A vertical line indicates the position of the $B$ meson. It may be
seen that the result for $f_B$ is given by the interpolation between these two
series of points. It is clear that the accuracy of the prediction for $f_B$
depends on the accuracy on $f_P$ for $M_P$ in the $M_D$ region. Hence, a
theoretical improvement and experimental test of the predictions for $D$ decays
is also useful to increase the accuracy of the predictions in the $B$ sector.
Results from different collaborations on $f_B$, summarized in \cite{asmaa},
are given in table 4.
\begin{table}
\centering
{
\begin{tabular} {|c|c|c|c|c|}
\hline
Ref.&$\beta$& $f_B$($\mev$)&${f_{B_s}\over f_{B_d}}$\\ \hline
ELC\small{(W)} &6.4&$205 \pm 40$&$1.08 \pm 0.06$ \\ \hline
APE \small{(S-C)} &6.2&$290\pm 15 \pm 45$&$1.11(3)$ \\ \hline
APE \small{(S)} &6.0&$350\pm 40 \pm 30$&$1.14(4)$ \\ \hline
APE \small{(S-C)} &6.0&$328\pm 36 $&$1.19(5)$ \\ \hline
UKQCD \small{(C)} &6.2&$160 ^{+6}_{-6}$ $^{+53}_{-19}$&$1.22\pm
0.04$ \\ \hline
UKQCD \small{(S-C)}&6.2&$253 ^{+16}_{-15}$ $^{+105}_{-14}
$&$1.14^{+4}_{-3}$ \\ \hline
BLS \small{(S)}&6.3&$235(20)\pm 21$&$1.11 \pm 0.05 $\\ \hline
Allton\small{(S-W)}&6.0&$310 \pm 25\pm 50$ &$1.09\pm 0.04$ \\
\hline
HEMCGC&5.6&$200\pm 48$&- \\ \hline
\end{tabular}
\caption{{S refers to static quarks (infinite mass). The other values for $f_B$
have been interpolated to the physical $B$ mass as shown in fig. 3. It is clear
in fig. 3 and in this table that the static values are higher than the
interpolated ones. The HEMCGC unquenched result agrees with those obtained in
the quenched approximation. For the quenched case, $\beta=6.4$ corresponds to a
lattice spacing of $\sim 0.05$ fm, while $\beta=6.0$ corresponds to $\sim 0.1$
fm.}}
}
\end{table}
\vskip 0.1cm
There exists also a specific lattice technique fit for the study of the
quarkonia, and particularly the spectra of the $\Upsilon$'s (i.e. $b \bar b$
bound states). This is called Non Relativistic QCD (NRQCD) \cite{lepage}. This
method is based on a discretization of the expansion of QCD in the heavy quark
velocity:
\be S_{NR}= \psi^\dagger(x) D_t \psi(x) + \psi^\dagger(x)\frac {D^2}{2M} \psi +
....\ee
where $\psi$ are two-component spinor fields (quark fields are decoupled form
antiquarks). This method allows also to study the first hadronic excitations,
while the standard method is confined to the ground states as exemplified in
section \ref{fpi}. The results seem rather good but I will skip a more detailed
account of this field
for lack of time. For recent reviews, see \cite{shige}.
\section{Conclusions and prospects.}
Lattice QCD is a rigorous non-perturbative calculational method based on the
first principles of QCD. It allows to compute numerically many simple processes
implying hadrons, and to deal with a large number of phenomenological and
theoretical issues.
The practical limitations in the computing power lead to the frequent use of
the quenched approximation. They also yield limitations to the domain of
lattice QCD: the momenta are quantized to a few allowed values due to the
finite volume, and also bounded to values below or equal to $\sim$ 1 GeV. Only
the $s$ and $c$ quarks have masses that allow a direct study on the lattices.
Generally speaking, only ground states and only systems with one hadron at a
time are available.
The light quark physics is obtained through a chiral extrapolation. Quenched
approximation becomes wrong very close to the chiral limit. The $b$ quark
physics is obtained through an extrapolation (or interpolation) guided by the
HQET.
The comparison with experiment is very encouraging within the present
uncertainties which are still large:
the statistical error can be as small as $5\%$ with present statistics but the
systematic error is seldom less than $15\%$. The unquenched calculations have
still larger errors.
The state of the art is improving quite fast, thanks to a very active
theoretical work, and to computer improvements. Much of the latter is due to
dedicated computers built by physicists. The Gigaflop frontier has been
overcome since a few years, and the present leaders are between 10 and 100
Gigaflops. The Teraflop goal is within sight. The average improvement rate is
of a factor 10 every 4 years, which means a doubling of the number of lattice
points in every directions every 5-6 years, or a decrease of the statistical
error by a factor 4 in the same time. The theoretical work consists in
improving the lattice actions to obtain a faster approach to the continuum
limit ($a\to 0$), in increasing our understanding of the finite volume effects,
in improving the renormalization procedure, etc. In short, the theoretical
improvements aim at lessening the systematic errors. It is of course more
difficult to quantify the improvements in this domain than for the statistical
errors.
What accuracy will be reached in, say, ten years? I do not doubt that the
statistical error will be as low as 1\%, at least for the ``best'' physical
quantities. Concerning the systematics, it is more difficult to guess. 5\% ?
3\% ? 1\% ? One has the right to dream! Anyhow I can assure you of one thing:
the lattice community {\it does} work hard.
\section*{Acknowledgements}
I would like to thank Asmaa Abada, Philippe Boucaud and Alain Le Yaouanc who
have helped me in preparing this talk and read the manuscript. I would also
like to thank the Clermont-Ferrand team who has so much contributed to the
success of this meeting.
This work was supported in part by the CEC Science Project SC1-CT91-0729 and by
the Human Capital
and Mobility Programme, contract CHRX-CT93-0132.
\begin{thebibliography}{9}
\bibitem{wi} K.G. Wilson, in ``New Phenomena in Sub-nuclear Physics",
ed. A. Zichichi, Plenum, New york (1977).
\bibitem{has} P. Hasenfratz, Nucl. Phys. {\bf B} (Proc. Suppl.) {\bf 34} (1994)
3.
\bibitem{creutz} See M. Creutz, Quarks, Gluons and Lattices, (Cambridge Univ.
Press 1983) and references therein.
\bibitem{maiani}M.L\"uscher Comm. Math. Phys. {\bf 104}, 177 (1987); ibidem
{\bf 105}, 153 (1986); L. Maiani and M. Testa, Phys. Lett. {\bf 245B},
585 (1990).
\bibitem{quark}
J. B. Kogut and L. Susskind, Phys. Rev. {\bf D11} (1975) 395; J.L. Alonso, Ph.
Boucaud, J.L. Cort\'es and E. Rivas Mod. Phys. Lett. {\bf A5} 275 (1990). D.B.
Kaplan, Phys. Lett. {\bf B288} (1992) 342. For a review see J. Smit Nucl. Phys.
{\bf B} (Proc. Suppl.) {\bf 4} (1988) 451.
\bibitem{impr} K. Symanzik, in Mathematical problems in theoretical physics,
eds. R. Scrader et al. Lecture notes in Physics, 153 (Springer, Berlin 1982);
B. Sheikhoslami and R. Wohlert, Nucl. Phys. {\bf B259} (1985) 572.
\bibitem{carla} For a recent study see G. Martinelli et al CERN-TH 7342/94,
hep-ph 9411010, and references therein.
\bibitem{sharpe} C. Bernard and M Golterman, Phys. Rev. {\bf D46} (1992) 853;
S. Sharpe Phys. Rev. {\bf D46} (1992) 3146; for a recent discussion see S.
Sharpe UW/PT 94-15, hep-ph/9412243.
\bibitem{kim} S. Kim and D.K. Sinclair ANL-HEP-95-05, hep-lat: 9502004.
\bibitem{gupta} R. Gupta, talk at ``LATTICE 94'', Bielefeld, Germany, 9/94
hep-lat: 9412078.
\bibitem{wein} D. Weingarten, ``LATTICE 93'', Nucl. Phys. {\bf B} (Proc.
Suppl.)
{\bf 34} (1994) 29.
\bibitem{hemcg} K. Bitar et al, Phys. Rev. {\bf D46} (1992) 2169.
\bibitem{kim2} See a recent publication S. Kim and D.K. Sinclair, ``LATTICE
93'', Nucl. Phys. {\bf B} (Proc. Suppl.)
{\bf 34} (1994) 347.
\bibitem{guido}G. Martinelli and C.T. Sachrajda, Nucl. Phys. {\bf B316} (1989)
355; G. Martinelli Nucl. Phys. {\bf B} (Proc. Suppl.)
{\bf 9} (1989) 134.
\bibitem{goker} M. G\"okerler et al. DESY 94-227, hep-lat: 9412055.
\bibitem{martin} A.D. Martin, W.J. Stirling and R.G. Roberts, Phys. Rev. {\bf
D47} (1993) 867.
\bibitem{shige} For recent reviews see J. Shigemitsu, ICHEP94 conference,
Glasgow, July 1994, hep-ph: 9410212; A. X. El-Khadra, International Symposium
Physics in Collisions `94, Tallahassee, Florida, June 1994, DOE/ER/01545-637,
hep-ph:9412279.
\bibitem{asmaa}As. Abada, ICHEP94 conference, Glasgow, July 1994, hep-ph:
9409338.
\bibitem{witherell}M. S. Witherell, Invited talk at International Symposium on
Lepton and Photon Interactions at High Energies, Cornell, Ithaca, N.Y.,
UCSB-HEP-93-06.
\bibitem{elc} ELC: As. Abada {\it et al.}, Nucl.Phys.{\bf B376}(1992) 172.
\bibitem{eichten} E. Eichten, Nucl.Phys.B(proc.Suppl.)4(1988) 170.
\bibitem{lepage}P. Lepage and B. Thacker, Phys. Rev. {\bf D43} (1991) 196; P.
Lepage et al. Phys. Rev {\bf D46} (1992) 4052.
\end{thebibliography}
\end{document}
%% BEGIN: pstricks.tex
%% Generated on <1993/3/12> from `pstricks.doc'.
%% For use with the PostScript header file `pstricks.pro'.
%%
\def\fileversion{0.93a}
\def\filedate{93/03/12}
%%
%% See the PSTricks read-me file and the User's Guide for documentation.
%%
%% COPYRIGHT 1993, by Timothy Van Zandt, tvz@Princeton.EDU
%%
%% Copying of part or all of any file in the pstricks.tex package
%% is allowed under the following conditions only:
%% (1) You may freely distribute unchanged copies of the files. Please
%% include the documentation when you do so.
%% (2) You may modify a renamed copy of any file, but only for personal
%% use or use within an organization.
%% (3) You may copy fragments from the files, for personal use or for use
%% in a macro package for distribution, as long as credit is given
%% where credit is due.
%%
%% You are NOT ALLOWED to take money for the distribution or use of
%% these files or modified versions or fragments thereof, except for
%% a nominal charge for copying etc.
%%
\csname PSTricksLoaded\endcsname
\let\PSTricksLoaded\endinput
\edef\PstAtCode{\the\catcode`\@}
\catcode`\@=11\relax
\expandafter\ifx\csname @latexerr\endcsname\relax
\long\def\@ifundefined#1#2#3{\expandafter\ifx\csname
#1\endcsname\relax#2\else#3\fi}
\def\@namedef#1{\expandafter\def\csname #1\endcsname}
\def\@nameuse#1{\csname #1\endcsname}
\def\@eha{%
Your command was ignored.^^J
Type \space I <command> <return> \space to replace
it with another command,^^J
or \space <return> \space to continue without it.}
\def\@spaces{\space\space\space\space}
\def\typeout#1{\immediate\write\@unused{#1}}
\alloc@7\write\chardef\sixt@@n\@unused
\def\@empty{}
\def\@gobble#1{}
\def\@nnil{\@nil}
\def\@ifnextchar#1#2#3{%
\let\@tempe#1\def\@tempa{#2}\def\@tempb{#3}\futurelet\@tempc\@ifnch}
\def\@ifnch{%
\ifx\@tempc\@sptoken
\let\@tempd\@xifnch
\else
\ifx\@tempc\@tempe \let\@tempd\@tempa \else \let\@tempd\@tempb \fi
\fi
\@tempd}
\begingroup
\def\:{\global\let\@sptoken= } \:
\def\:{\@xifnch} \expandafter\gdef\: {\futurelet\@tempc\@ifnch}
\endgroup
\fi
\typeout{`PSTricks' v\fileversion\space\space <\filedate> (tvz)}
\def\@pstrickserr#1#2{%
\begingroup
\newlinechar`\^^J
\edef\pst@tempc{#2}%
\expandafter\errhelp\expandafter{\pst@tempc}%
\typeout{%
PSTricks error. \space See User's Guide for further information.^^J
\@spaces\@spaces\@spaces\@spaces
Type \space H <return> \space for immediate help.}%
\errmessage{#1}%
\endgroup}
\def\@ehpa{%
Your command was ignored. Default value substituted.^^J
Type \space <return> \space to procede.}
\def\@ehpb{%
Your command was ignored. Will recover best I can.^^J
Type \space <return> \space to procede.}
\def\@ehpc{%
You better fix this before proceding.^^J
See the PSTricks User's Guide or ask your system administrator for help.^^J
Type \space X <return> \space to quit.}
\def\pst@misplaced#1{\@pstrickserr{Misplaced \string#1 command}\@ehpb}
\newdimen\pst@dima
\newdimen\pst@dimb
\newdimen\pst@dimc
\newdimen\pst@dimd
\newdimen\pst@dimg
\newdimen\pst@dimh
\newbox\pst@hbox
\newbox\pst@boxg
\newcount\pst@cnta
\newcount\pst@cntb
\newcount\pst@cntc
\newcount\pst@cntd
\newcount\pst@cntg
\newcount\pst@cnth
\newif\if@pst
\newif\if@star
\def\pst@ifstar#1{%
\@ifnextchar*{\@startrue\def\next*{#1}\next}{\@starfalse#1}}
\def\pst@expandafter#1#2{%
\def\next{#1}%
\edef\@tempa{#2}%
\ifx\@tempa\@empty
\@pstrickserr{Unexpected empty argument!}\@ehpb
\def\@tempa{\@empty}%
\fi
\expandafter\next\@tempa}
\def\pst@dimtonum#1#2{\edef#2{\pst@@dimtonum#1}}
\def\pst@@dimtonum#1{\expandafter\pst@@@dimtonum\the#1}
{\catcode`\p=12 \catcode`\t=12 \global\@namedef{pst@@@dimtonum}#1pt{#1}}
\def\pst@pyth#1#2#3{%
\ifdim#1>#2\pst@@pyth#1#2#3\else\pst@@pyth#2#1#3\fi}
\def\pst@@pyth#1#2#3{%
\ifdim4#1>9#2%
#3=#1\advance#3 .2122#2%
\else
#3=.8384#1\advance#3 .5758#2%
\fi}
\def\pst@divide#1#2#3{%
\begingroup
\pst@dimg=#1\relax\pst@dimh=#2\relax
\pst@cnta=\pst@dimg
\pst@cntb=1073741824
\pst@cntc=65536
\def\pst@tempa{\fi\ifnum}%
\loop\ifnum\pst@cnta<\pst@cntb
\pst@tempa\pst@cntc>\@ne
\multiply\pst@cnta2\divide\pst@cntc2
\repeat
\divide\pst@dimh\pst@cntc
\divide\pst@cnta\pst@dimh
\global\pst@dimg\number\pst@cnta sp
\endgroup
\pst@dimtonum\pst@dimg#3}
\def\pst@configerr#1{%
\@pstrickserr{\string#1 not defined in pstricks.con}\@ehpc}
% % \begin{macrocode}
\def\pstVerb#1{\pst@configerr\pstVerb}
\def\pstverb#1{\pst@configerr\pstverb}
\def\pstverbscale{\pst@configerr\pstverbscale}
\def\pstrotate{\pst@configerr\pstrotate}
\def\pstheader#1{\pst@configerr\pstheader}
\def\pstdriver{\pst@configerr\pstdriver}
\@ifundefined{pstcustomize}%
{\def\pstcustomize{\endinput\let\pstcustomize\relax}}{}
\input pstricks.con
\newif\ifPSTricks
\PSTrickstrue
\def\PSTricksOff{%
\def\pstheader##1{}%
\def\pstverb##1{}%
\def\pstVerb##1{}%
\PSTricksfalse}
\@ifundefined{pst@def}{\def\pst@def#1<#2>{\@namedef{tx@#1}{#2 }}}{}
\@ifundefined{pst@ATH}{\def\pst@ATH<#1>{}}{}
\pstheader{pstricks.pro}
\def\pst@dict{tx@Dict begin }
\def\pst@theheaders{pstricks.pro}
\def\pst@Verb#1{\pstVerb{\pst@dict #1 end}}
\def\tx@Atan{Atan }
\def\tx@Div{Div }
\def\tx@NET{NET }
\def\tx@Pyth{Pyth }
\def\tx@PtoC{PtoC }
\def\tx@PathLength@{PathLength@ }
\def\tx@PathLength{PathLength }
\pst@dimg=\pstunit\relax
\ifdim\pst@dimg=1bp
\def\pst@stp{.996264 dup scale}
\else
\edef\pst@stp{1 \pst@@dimtonum\pst@dimg\space div dup scale}
\fi
\def\tx@STP{STP }
\def\tx@STV{STV }
\def\pst@number#1{\pst@@dimtonum#1\space}
\def\pst@checknum#1#2{%
\edef\next{#1}%
\ifx\next\@empty
\let\pst@num\z@
\else
\expandafter\pst@@checknum\next..\@nil
\fi
\ifnum\pst@num=\z@
\@pstrickserr{Bad number: `#1'. 0 substituted.}\@ehpa
\def#2{0 }%
\else
\edef#2{\ifnum\pst@num=2 -\fi\the\pst@cntg.%
\expandafter\@gobble\the\pst@cnth\space}%
\fi}
\def\pst@@checknum{%
\@ifnextchar-%
{\def\pst@num{2}\expandafter\pst@@@checknum\@gobble}%
{\def\pst@num{1}\pst@@@checknum}}
\def\pst@@@checknum#1.#2.#3\@nil{%
\afterassignment\pst@@@@checknum\pst@cntg=0#1\relax\@nil
\afterassignment\pst@@@@checknum\pst@cnth=1#2\relax\@nil}
\def\pst@@@@checknum#1\relax\@nil{%
\ifx\@nil#1\@nil\else\let\pst@num\z@\fi}
\def\pst@getnumii#1 #2 #3\@nil{%
\pst@checknum{#1}\pst@tempg
\pst@checknum{#2}\pst@temph}
\def\pst@getnumiii#1 #2 #3 #4\@nil{%
\pst@checknum{#1}\pst@tempg
\pst@checknum{#2}\pst@temph
\pst@checknum{#3}\pst@tempi}
\def\pst@getnumiv#1 #2 #3 #4 #5\@nil{%
\pst@checknum{#1}\pst@tempg
\pst@checknum{#2}\pst@temph
\pst@checknum{#3}\pst@tempi
\pst@checknum{#4}\pst@tempj}
\def\pst@getdimnum#1 #2 #3\@nil{%
\pssetlength\pst@dimg{#1}%
\pst@checknum{#2}\pst@tempg}
\def\pst@getscale#1#2{%
\pst@expandafter\pst@getnumii{#1 #1} {} {} {}\@nil
\edef#2{\pst@tempg\space \pst@temph\space scale }%
\ifdim\pst@tempg\p@=\z@
\@pstrickserr{Bad scaling argument `#1'}\@ehpa
\def#2{}%
\else
\ifdim\pst@temph\p@=\z@
\@pstrickserr{Bad scaling argument}\@ehpa
\def#2{}%
\else
\ifdim\pst@tempg\p@=\p@ \ifdim\pst@temph\p@=\p@ \def#2{}\fi\fi
\fi
\fi}
\def\pst@getint#1#2{%
\pst@cntg=#1\relax
\edef#2{\the\pst@cntg\space}}
\begingroup
\catcode`\{=12
\catcode`\}=12
\catcode`\[=1
\catcode`\]=2
\gdef\pslbrace[{ ]
\gdef\psrbrace[} ]
\endgroup
\def\@newcolor#1#2{%
\expandafter\edef\csname #1\endcsname{\noexpand\pst@color{#2}}%
\expandafter\edef\csname color@#1\endcsname{#2}%
\ignorespaces}
\def\pst@color#1{%
\def\pst@currentcolor{#1}\pstVerb{#1}\aftergroup\pst@endcolor}
\def\pst@endcolor{\pstVerb{\pst@currentcolor}}
\def\pst@currentcolor{0 setgray}
\def\altcolormode{%
\def\pst@color##1{%
\pstVerb{gsave ##1}\aftergroup\pst@endcolor}%
\def\pst@endcolor{\pstVerb{\pst@grestore}}}
\def\pst@grestore{%
currentpoint
matrix currentmatrix
currentfont
grestore
setfont
setmatrix
moveto}
\def\pst@usecolor#1{\csname color@#1\endcsname\space}
\def\newgray#1#2{%
\pst@checknum{#2}\pst@tempg
\@newcolor{#1}{\pst@tempg setgray}}
\def\newrgbcolor#1#2{%
\pst@expandafter\pst@getnumiii{#2} {} {} {} {}\@nil
\@newcolor{#1}{\pst@tempg \pst@temph \pst@tempi setrgbcolor}}
\def\newhsbcolor#1#2{%
\pst@expandafter\pst@getnumiii{#2} {} {} {} {}\@nil
\@newcolor{#1}{\pst@tempg \pst@temph \pst@tempi sethsbcolor}}
\def\newcmykcolor#1#2{%
\pst@expandafter\pst@getnumiv{#2} {} {} {} {} {}\@nil
\@newcolor{#1}{\pst@tempg \pst@temph \pst@tempi \pst@tempj setcmykcolor}}
\newgray{black}{0}
\newgray{darkgray}{.25}
\newgray{gray}{.5}
\newgray{lightgray}{.75}
\newgray{white}{1}
\newrgbcolor{red}{1 0 0}
\newrgbcolor{green}{0 1 0}
\newrgbcolor{blue}{0 0 1}
\newrgbcolor{yellow}{1 1 0}
\newrgbcolor{cyan}{0 1 1}
\newrgbcolor{magenta}{1 0 1}
\def\psset#1{\@psset#1,\@nil\ignorespaces}
\def\@psset#1,{%
\@@psset#1==\@nil
\@ifnextchar\@nil{\@gobble}{\@psset}}
\def\@@psset#1=#2=#3\@nil{%
\@ifundefined{psset@#1}%
{\@pstrickserr{Graphics parameter `#1' not defined.}\@ehpa}%
{\@nameuse{psset@#1}{#2}}}%
\def\psset@style#1{%
\@ifundefined{pscs@#1}%
{\@pstrickserr{Custom style `#1' undefined}\@ehpa}%
{\@nameuse{pscs@#1}}}
\def\newpsstyle#1#2{\@namedef{pscs@#1}{\psset{#2}}}
\def\@none{none}
\def\pst@getcolor#1#2{%
\@ifundefined{color@#1}%
{\@pstrickserr{Color `#1' not defined}\@eha}%
{\edef#2{#1}}}
\newdimen\psunit \psunit 1cm
\newdimen\psxunit \psxunit 1cm
\newdimen\psyunit \psyunit 1cm
\let\psrunit\psunit
\def\pstunit@off{\let\@psunit\ignorespaces\ignorespaces}
\def\pssetlength#1#2{%
\let\@psunit\psunit
\afterassignment\pstunit@off
#1 #2\@psunit}
\def\psaddtolength#1#2{%
\let\@psunit\psunit
\afterassignment\pstunit@off
\advance#1 #2\@psunit}
\def\pssetxlength#1#2{%
\let\@psunit\psxunit
\afterassignment\pstunit@off
#1 #2\@psunit}
\def\pssetylength#1#2{%
\let\@psunit\psyunit
\afterassignment\pstunit@off
#1 #2\@psunit}
\def\psset@unit#1{%
\pssetlength\psunit{#1}%
\psxunit=\psunit
\psyunit=\psunit}
\def\psset@runit#1{\pssetlength\psrunit{#1}}
\def\psset@xunit#1{\pssetxlength\psxunit{#1}}
\def\psset@yunit#1{\pssetylength\psyunit{#1}}
\def\pst@getlength#1#2{%
\pssetlength\pst@dimg{#1}%
\edef#2{\pst@number\pst@dimg}}
\def\pst@@getlength#1#2{%
\pssetlength\pst@dimg{#1}%
\edef#2{\number\pst@dimg sp}}
\def\pst@getcoor#1#2{\pst@@getcoor{#1}\let#2\pst@coor}
\def\pst@coor{0 0 }
\def\pst@getcoors#1#2{%
\def\pst@aftercoors{\addto@pscode{#1 \pst@coors }#2}%
\def\pst@coors{}%
\pst@@getcoors}
\def\pst@@getcoors(#1){%
\pst@@getcoor{#1}%
\edef\pst@coors{\pst@coor\pst@coors}%
\@ifnextchar({\pst@@getcoors}{\pst@aftercoors}}
\def\pst@getangle#1#2{\pst@@getangle{#1}\let#2\pst@angle}
\def\pst@angle{0 }
\def\cartesian@coor#1,#2,#3\@nil{%
\pssetxlength\pst@dimg{#1}%
\pssetylength\pst@dimh{#2}%
\edef\pst@coor{\pst@number\pst@dimg \pst@number\pst@dimh}}
\def\NormalCoor{%
\def\pst@@getcoor##1{\pst@expandafter\cartesian@coor{##1},\relax,\@nil}%
\def\pst@@getangle##1{%
\pst@checknum{##1}\pst@angle
\edef\pst@angle{\pst@angle \pst@angleunit}}%
\def\psput@##1{\pst@@getcoor{##1}\leavevmode\psput@cartesian}}
\NormalCoor
\def\degrees{\@ifnextchar[{\@degrees}{\def\pst@angleunit{}}}
\def\@degrees[#1]{%
\pst@checknum{#1}\pst@tempg
\edef\pst@angleunit{360 \pst@tempg div mul }%
\ignorespaces}
\def\radians{\def\pst@angleunit{57.2956 mul }}
\def\pst@angleunit{}
\def\SpecialCoor{%
\def\pst@@getcoor##1{\pst@expandafter\special@coor{##1}||\@nil}%
\def\pst@@getangle##1{\pst@expandafter\special@angle{##1}\@empty)\@nil}%
\def\psput@##1{\pst@@getcoor{##1}\leavevmode\psput@special}}
\def\special@coor#1|#2|#3\@nil{%
\ifx#3|\relax
\mixed@coor{#1}{#2}%
\else
\special@@coor#1;;\@nil
\fi}
\def\special@@coor#1{%
\ifcat#1a\relax
\def\next{\node@coor#1}%
\else
\ifx#1[\relax
\def\next{\Node@coor[}%
\else
\ifx#1!\relax
\def\next{\raw@coor}%
\else
\def\next{\special@@@coor#1}%
\fi
\fi
\fi
\next}
\def\special@@@coor#1;#2;#3\@nil{%
\ifx#3;\relax
\polar@coor{#1}{#2}%
\else
\cartesian@coor#1,\relax,\@nil
\fi}
\def\mixed@coor#1#2{%
\begingroup
\specialcoor@ii#1;;\@nil
\let\pst@tempa\pst@coor
\specialcoor@ii#2;;\@nil
\xdef\pst@tempg{\pst@tempa pop \pst@coor exch pop }%
\endgroup
\let\pst@coor\pst@tempg}
\def\polar@coor#1#2{%
\pssetlength\pst@dimg{#1}%
\pst@@getangle{#2}%
\edef\pst@coor{\pst@number\pst@dimg \pst@angle \tx@PtoC}}
\def\raw@coor#1;#2\@nil{%
\edef\pst@coor{%
#1 \pst@number\psyunit mul exch \pst@number\psxunit mul exch }}
\def\node@coor#1\@nil{%
\@pstrickserr{You must load `pst-node.tex' to use node coordinates.}\@ehps
\def\pst@coor{0 0 }}
\def\Node@coor{\node@coor}
\def\special@angle#1#2)#3\@nil{%
\ifx#1!\relax
\edef\pst@angle{#2 \pst@angleunit}%
\else
\ifx#1(\relax
\pst@@getcoor{#2}%
\edef\pst@angle{\pst@coor exch \tx@Atan}%
\else
\pst@checknum{#1#2}\pst@angle
\edef\pst@angle{\pst@angle \pst@angleunit}%
\fi
\fi}
\def\Cartesian{%
\def\cartesian@coor##1,##2,##3\@nil{%
\pssetxlength\pst@dimg{##1}%
\pssetylength\pst@dimh{##2}%
\edef\pst@coor{\pst@number\pst@dimg \pst@number\pst@dimh}}%
\@ifnextchar({\Cartesian@}{}}
\def\Cartesian@(#1,#2){%
\pssetxlength\psxunit{#1}%
\pssetylength\psyunit{#2}%
\ignorespaces}
\def\Polar{%
\def\psput@cartesian{\psput@special}%
\def\cartesian@coor##1,##2,##3\@nil{\polar@coor{##1}{##2}}}%
\def\psset@origin#1{%
\pst@@getcoor{#1}%
\edef\psk@origin{\pst@coor \tx@NET }}
\def\psk@origin{}
\newif\ifswapaxes
\def\psset@swapaxes#1{%
\@nameuse{@pst#1}%
\if@pst
\def\psk@swapaxes{-90 rotate -1 1 scale }%
\else
\def\psk@swapaxes{}%
\fi}
\psset@swapaxes{false}
\newif\ifshowpoints
\def\psset@showpoints#1{\@nameuse{showpoints#1}}
\psset@showpoints{false}
\let\pst@setrepeatarrowsflag\relax
\def\psset@border#1{%
\pst@getlength{#1}\psk@border
\pst@setrepeatarrowsflag}
\psset@border{0pt}
\def\psset@bordercolor#1{\pst@getcolor{#1}\psbordercolor}
\psset@bordercolor{white}
\newif\ifpsdoubleline
\def\psset@doubleline#1{%
\@nameuse{psdoubleline#1}%
\pst@setrepeatarrowsflag}
\psset@doubleline{false}
\def\psset@doublesep#1{\def\psdoublesep{#1}}
\psset@doublesep{1.25\pslinewidth}
\def\psset@doublecolor#1{\pst@getcolor{#1}\psdoublecolor}
\psset@doublecolor{white}
\newif\ifpsshadow
\def\psset@shadow#1{%
\@nameuse{psshadow#1}%
\pst@setrepeatarrowsflag}
\psset@shadow{false}
\def\psset@shadowsize#1{\pst@getlength{#1}\psk@shadowsize}
\psset@shadowsize{3pt}
\def\psset@shadowangle#1{\pst@getangle{#1}\psk@shadowangle}
\psset@shadowangle{-45}
\def\psset@shadowcolor#1{\pst@getcolor{#1}\psshadowcolor}
\psset@shadowcolor{darkgray}
\def\pst@repeatarrowsflag{\z@}
\def\pst@setrepeatarrowsflag{%
\edef\pst@repeatarrowsflag{%
\ifdim\psk@border\p@>\z@ 1\else\ifpsdoubleline 1\else
\ifpsshadow 1\else \z@\fi\fi\fi}}
\def\psls@none{}
\newdimen\pslinewidth
\def\psset@linewidth#1{\pssetlength\pslinewidth{#1}}
\psset@linewidth{.8pt}
\def\psset@linecolor#1{\pst@getcolor{#1}\pslinecolor}
\psset@linecolor{black}
\def\psls@solid{0 setlinecap stroke }
\def\psset@dash#1{%
\pst@expandafter\psset@@dash{#1} * * *\@nil
\edef\psk@dash{\pst@number\pst@dimg \pst@number\pst@dimh}}
\def\psset@@dash#1 #2 #3\@nil{%
\pssetlength\pst@dimg{#1}%
\pssetlength\pst@dimh{#2}}
\psset@dash{5pt 3pt}
\def\psls@dashed{\psk@dash \pst@linetype\space \tx@DashLine}
\def\tx@DashLine{DashLine }
\def\psset@dotsep#1{\pst@getlength{#1}\psk@dotsep}
\psset@dotsep{3pt}
\def\psls@dotted{\psk@dotsep \pst@linetype\space \tx@DotLine}%
\def\tx@DotLine{DotLine }
\def\psset@linestyle#1{%
\@ifundefined{psls@#1}%
{\@pstrickserr{Line style `#1' not defined}\@eha}%
{\edef\pslinestyle{#1}}}
\psset@linestyle{solid}
\def\psfs@none{}
\def\psset@fillcolor#1{\pst@getcolor{#1}\psfillcolor}
\psset@fillcolor{white}
\def\psfs@solid{\pst@usecolor\psfillcolor fill }
\def\psset@hatchwidth#1{\pst@getlength{#1}\psk@hatchwidth}
\psset@hatchwidth{.8pt}
\def\psset@hatchsep#1{\pst@getlength{#1}\psk@hatchsep}
\psset@hatchsep{4pt}
\def\psset@hatchcolor#1{\pst@getcolor{#1}\pshatchcolor}
\psset@hatchcolor{black}
\def\psset@hatchangle#1{\pst@getangle{#1}\psk@hatchangle}
\psset@hatchangle{45}
\def\psfs@hlines{%
\psk@hatchangle rotate
\psk@hatchwidth SLW
\pst@usecolor\pshatchcolor
\psk@hatchsep \tx@LineFill}
\@namedef{psfs@hlines*}{gsave \psfs@solid grestore \psfs@hlines}
\def\tx@LineFill{LineFill }
\def\tx@LineFill{LineFill }
\def\psfs@vlines{%
90 rotate
\psfs@hlines}
\@namedef{psfs@vlines*}{gsave \psfs@solid grestore \psfs@vlines}
\def\psfs@crosshatch{gsave \psfs@hlines grestore \psfs@vlines}
\@namedef{psfs@crosshatch*}{%
gsave \psfs@solid grestore
gsave \psfs@hlines grestore
\psfs@vlines}
\def\psset@fillstyle#1{%
\@ifundefined{psfs@#1}%
{\@pstrickserr{Undefined fill style: `#1'}\@eha}%
{\edef\psfillstyle{#1}}}
\psset@fillstyle{none}
\def\psset@arrows#1{%
\begingroup
\pst@activearrows
\xdef\pst@tempg{#1}%
\endgroup
\expandafter\psset@@arrows\pst@tempg\@empty-\@empty\@nil
\if@pst\else
\@pstrickserr{Bad arrows specification: #1}\@ehpa
\fi}
\def\psset@@arrows#1-#2\@empty#3\@nil{%
\@psttrue
\def\next##1,#1-##2,##3\@nil{\def\pst@tempg{##2}}%
\expandafter\next\pst@arrowtable,#1-#1,\@nil
\@ifundefined{psas@\pst@tempg}%
{\@pstfalse\def\psk@arrowA{}}%
{\let\psk@arrowA\pst@tempg}%
\@ifundefined{psas@#2}%
{\@pstfalse\def\psk@arrowB{}}%
{\def\psk@arrowB{#2}}}
\def\psk@arrowA{}
\def\psk@arrowB{}
\def\pst@arrowtable{,<->,<<->>,>-<,>>-<<,(-),[-]}
\begingroup
\catcode`\<=13
\catcode`\>=13
\catcode`\|=13
\gdef\pst@activearrows{\def<{\string<}\def>{\string>}\def|{\string|}}
\endgroup
\def\tx@BeginArrow{BeginArrow }
\def\tx@EndArrow{EndArrow }
\def\psset@arrowscale#1{\pst@getscale{#1}\psk@arrowscale}
\psset@arrowscale{1}
\def\psset@arrowsize#1{%
\pst@expandafter\pst@getdimnum{#1} {} {} {}\@nil
\edef\psk@arrowsize{\pst@number\pst@dimg \pst@tempg}}
\psset@arrowsize{2pt 3}
\def\psset@arrowlength#1{\pst@checknum{#1}\psk@arrowlength}
\psset@arrowlength{1.4}
\def\psset@arrowinset#1{\pst@checknum{#1}\psk@arrowinset}%
\psset@arrowinset{.4}
\def\tx@Arrow{Arrow }
\@namedef{psas@>}{%
false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow}
\@namedef{psas@>>}{%
false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow
0 h T
gsave
newpath
false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow
CP
grestore
CP newpath moveto
2 copy
L
stroke
moveto}
\@namedef{psas@<}{%
true \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow}
\@namedef{psas@<<}{%
true \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow
CP newpath moveto 0 a neg L stroke 0 h neg T
false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow}
\def\psset@tbarsize#1{%
\pst@expandafter\pst@getdimnum{#1} {} {} {}\@nil
\edef\psk@tbarsize{\pst@number\pst@dimg \pst@tempg}}
\psset@tbarsize{2pt 5}
\def\tx@Tbar{Tbar }
\@namedef{psas@|}{\psk@tbarsize \tx@Tbar}
\@namedef{psas@|*}{0 CLW -2 div T \psk@tbarsize \tx@Tbar}
\def\psset@bracketlength#1{\pst@checknum{#1}\psk@bracketlength}
\psset@bracketlength{.15}
\def\tx@Bracket{Bracket }
\@namedef{psas@]}{\psk@bracketlength \psk@tbarsize \tx@Bracket}
\def\psset@rbracketlength#1{\pst@checknum{#1}\psk@rbracketlength}
\psset@rbracketlength{.15}
\def\tx@RoundBracket{RoundBracket }
\@namedef{psas@)}{\psk@rbracketlength \psk@tbarsize \tx@RoundBracket}
\def\psas@c{1 \psas@@c}
\def\psas@cc{0 CLW 2 div T 1 \psas@@c}
\def\psas@C{2 \psas@@c}
\def\psas@@c{%
setlinecap
0 0 moveto
0 CLW 2 div L
stroke
0 0 moveto}
\def\psas@{}
\psset@arrows{-}
\def\pst@par{}
\def\addto@par#1{%
\ifx\pst@par\@empty
\def\pst@par{#1}%
\else
\expandafter\def\expandafter\pst@par\expandafter{\pst@par,#1}%
\fi}
\def\use@par{%
\ifx\pst@par\@empty\else
\expandafter\@psset\pst@par,\@nil
\def\pst@par{}%
\fi}
\def\pst@object#1{%
\pst@ifstar{\@ifnextchar[{\pst@@object{#1}}{\@nameuse{#1@i}}}}
\def\pst@@object#1[#2]{%
\addto@par{#2}\@ifnextchar+{\@nameuse{#1@i}}{\@nameuse{#1@i}}}
\def\newpsobject#1#2#3{%
\@ifundefined{#2@i}%
{\@pstrickserr{Graphics object `#2' not defined}\@eha}%
{\@namedef{#1}{\def\pst@par{#3}\pst@object{#2}}}\ignorespaces}
\def\pst@getarrows#1{\@ifnextchar({#1}{\pst@@getarrows{#1}}}
\def\pst@@getarrows#1#2{\addto@par{arrows=#2}#1}
\def\begin@ClosedObj{%
\leavevmode
\pst@killglue
\begingroup
\use@par
\solid@star
\ifpsdoubleline \pst@setdoublesep \fi
\init@pscode}
\def\end@ClosedObj{%
\ifpsshadow \pst@closedshadow \fi
\ifdim\psk@border\p@>\z@ \pst@addborder \fi
\pst@fill
\pst@stroke
\ifpsdoubleline \pst@doublestroke \fi
\ifshowpoints
\addto@pscode{Points aload length 2 div cvi /N ED \psdots@iii}%
\fi
\use@pscode
\endgroup
\ignorespaces}
\def\begin@OpenObj{%
\begin@ClosedObj
\let\pst@linetype\pst@arrowtype
\pst@addarrowdef}
\def\begin@AltOpenObj{%
\begin@ClosedObj
\def\pst@repeatarrowsflag{\z@}%
\def\pst@linetype{0}}
\def\end@OpenObj{%
\ifpsshadow \pst@openshadow \fi
\ifdim\psk@border\p@>\z@ \pst@addborder \fi
\pst@fill
\pst@stroke
\ifpsdoubleline \pst@doublestroke \fi
\ifnum\pst@repeatarrowsflag>\z@ \pst@repeatarrows \fi
\ifshowpoints \pst@OpenShowPoints \fi
\use@pscode
\endgroup
\ignorespaces}
\def\begin@SpecialObj{%
\leavevmode
\pst@killglue
\begingroup
\use@par
\init@pscode}
\def\end@SpecialObj{%
\use@pscode
\endgroup
\ignorespaces}
\def\pst@code{}%
\def\init@pscode{%
\addto@pscode{%
\pst@number\pslinewidth SLW
\pst@usecolor\pslinecolor}}
\def\addto@pscode#1{\xdef\pst@code{\pst@code#1\space}}
\def\use@pscode{%
\pstverb{%
\pst@dict
\tx@STP
newpath
\psk@origin
\psk@swapaxes
\pst@code
end}%
\gdef\pst@code{}}
\def\KillGlue{%
\def\pst@killglue{\unskip\ifdim\lastskip>\z@\expandafter\pst@killglue\fi}}
\def\DontKillGlue{\let\pst@killglue\relax}
\DontKillGlue
\def\solid@star{%
\if@star
\pslinewidth=\z@
\psdoublelinefalse
\def\pslinestyle{none}%
\def\psfillstyle{solid}%
\let\psfillcolor\pslinecolor
\fi}
\def\pst@setdoublesep{%
\pst@getlength\psdoublesep\psdoublesep
\pslinewidth=2\pslinewidth
\advance\pslinewidth\psdoublesep\p@
\let\pst@setdoublesep\relax}
\def\tx@Shadow{Shadow }
\def\pst@closedshadow{%
\addto@pscode{%
gsave
\psk@shadowsize \psk@shadowangle \tx@PtoC
\tx@Shadow
\pst@usecolor\psshadowcolor
gsave fill grestore
stroke
grestore
gsave
\pst@usecolor\psfillcolor
gsave fill grestore
stroke
grestore}}
\def\pst@openshadow{%
\addto@pscode{%
gsave
\psk@shadowsize \psk@shadowangle \tx@PtoC
\tx@Shadow
\pst@usecolor\psshadowcolor
\ifx\psfillstyle\@none\else
gsave fill grestore
\fi
stroke}%
\pst@repeatarrows
\addto@pscode{grestore}
\ifx\psfillstyle\@none\else
\addto@pscode{%
gsave
\pst@usecolor\psfillcolor
gsave fill grestore
stroke
grestore}
\fi}
\def\pst@addborder{%
\addto@pscode{%
gsave
\psk@border 2 mul
CLW add SLW
\pst@usecolor\psbordercolor
stroke
grestore}}
\def\pst@stroke{%
\ifx\pslinestyle\@none\else
\addto@pscode{%
gsave
\pst@number\pslinewidth SLW
\pst@usecolor\pslinecolor
\@nameuse{psls@\pslinestyle}
grestore}%
\fi}
\def\pst@fill{%
\ifx\psfillstyle\@none\else
\addto@pscode{gsave \@nameuse{psfs@\psfillstyle} grestore}%
\fi}
\def\pst@doublestroke{%
\addto@pscode{%
gsave
\psdoublesep SLW
\pst@usecolor\psdoublecolor
stroke
grestore}}
\def\pst@arrowtype{%
\ifx\psk@arrowB\@empty 0 \else -2 \fi
\ifx\psk@arrowA\@empty 0 \else -1 \fi
add}
\def\pst@addarrowdef{%
\addto@pscode{%
/ArrowA {
\ifx\psk@arrowA\@empty
\pst@oplineto
\else
\pst@arrowdef{A}
moveto
\fi
} def
/ArrowB {
\ifx\psk@arrowB\@empty \else \pst@arrowdef{B} \fi
} def}}
\def\pst@arrowdef#1{%
\ifnum\pst@repeatarrowsflag>\z@
/Arrow#1c [ 6 2 roll ] cvx def Arrow#1c
\fi
\tx@BeginArrow
\psk@arrowscale
\@nameuse{psas@\@nameuse{psk@arrow#1}}
\tx@EndArrow}
\def\pst@repeatarrows{%
\addto@pscode{%
gsave
\ifx\psk@arrowA\@empty\else
ArrowAc ArrowA pop pop
\fi
\ifx\psk@arrowB\@empty\else
ArrowBc ArrowB pop pop pop pop
\fi
grestore}}
\def\pst@OpenShowPoints{%
\addto@pscode{%
gsave
\psk@dotsize
\@nameuse{psds@\psk@dotstyle}
/TheDot {
gsave T \psk@dotangle \psk@dotscale Dot grestore
} def
newpath
Points aload length 2 div 2 sub cvi /N ED
N 0 ge
{ \ifx\psk@arrowA\@empty
TheDot
\else
pop pop
\fi
N { TheDot } repeat
\ifx\psk@arrowB\@empty
TheDot
\else
pop pop
\fi }
{ N 2 mul { pop } repeat }
ifelse
grestore}}
\def\pscustom{\def\pst@par{}\pst@object{pscustom}}
\long\def\pscustom@i#1{%
\begin@SpecialObj
\solid@star
\let\pst@ifcustom\iftrue
\let\begin@ClosedObj\begin@CustomObj
\let\end@ClosedObj\endgroup
\def\begin@OpenObj{\begin@CustomObj\pst@addarrowdef}%
\let\end@OpenObj\endgroup
\let\begin@AltOpenObj\begin@CustomObj
\def\begin@SpecialObj{%
\begingroup
\pst@misplaced{special graphics object}%
\def\addto@pscode####1{}
\let\end@SpecialObj\endgroup}%
\def\@multips(##1)(##2)##3##4{\pst@misplaced\multips}%
\def\psclip##1{\pst@misplaced\psclip}%
\def\pst@repeatarrowsflag{\z@}%
\let\pst@setrepeatarrowsflag\relax
\showpointsfalse
\let\showpointstrue\relax
\def\pst@linetype{\pslinetype}%
\let\psset@liftpen\psset@@liftpen
\psset@liftpen{\z@}%
\def\pst@cp{/currentpoint load stopped pop }%
\def\pst@oplineto{/lineto load stopped { moveto } if }%
\def\pst@optcp##1##2{%
\ifnum##1=\z@\def##2{/currentpoint load stopped { 0 0 } if }\fi}%
\let\caddto@pscode\addto@pscode
\def\cuse@par##1{{\use@par##1}}%
\the\pst@customdefs
\setbox\pst@hbox=\hbox{#1}%
\pst@fill
\pst@stroke
\end@SpecialObj}
\def\begin@CustomObj{%
\begingroup
\use@par
\addto@pscode{%
\pst@number\pslinewidth SLW
\pst@usecolor\pslinecolor}}
\def\pst@oplineto{moveto }
\def\pst@cp{}
\def\pst@optcp#1#2{}
\def\psset@liftpen#1{}
\def\psset@@liftpen#1{%
\ifcase#1\relax
\def\psk@liftpen{\z@}%
\def\pst@cp{/currentpoint load stopped pop }%
\def\pst@oplineto{/lineto load stopped { moveto } if }%
\or
\def\psk@liftpen{1}%
\def\pst@cp{}%
\def\pst@oplineto{/lineto load stopped { moveto } if }%
\or
\def\psk@liftpen{2}%
\def\pst@cp{}%
\def\pst@oplineto{moveto }%
\fi}
\psset@liftpen{0}
\def\psk@liftpen{-1}
\def\psset@linetype#1{%
\pst@getint{#1}\pslinetype
\ifnum\pst@dimg<-3
\@pstrickserr{linetype must be greater than -3}\@ehpa
\def\pslinetype{0}%
\fi}
\psset@linetype{0}
\def\caddto@pscode#1{%
\@pstrickserr{Command can only be used in \string\pscustom}\@ehpa}
\let\cuse@par\caddto@pscode
\def\tx@MSave{%
/msavemtrx
[ tx@Dict /msavemtrx known { msavemtrx aload pop } if CM ]
def }
\def\tx@MRestore{%
tx@Dict /msavemtrx known { length 0 gt } { false } ifelse
{ /msavematrx [ msavematrx aload pop setmatrix ] def }
if }
\newtoks\pst@customdefs
\pst@customdefs{%
\def\newpath{\addto@pscode{newpath}}%
\def\moveto(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor moveto}}%
\def\closepath{\addto@pscode{closepath}}%
\def\gsave{\begingroup\addto@pscode{gsave}}%
\def\grestore{\endgroup\addto@pscode{grestore}}%
\def\translate(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor moveto}}%
\def\rotate#1{\pst@@getangle{#1}\addto@pscode{\pst@angle rotate}}%
\def\scale#1{\pst@getscale{#1}\pst@tempg\addto@pscode{\pst@tempg}}%
\def\msave{\addto@pscode{\tx@MSave}}%
\def\mrestore{\addto@pscode{\tx@MRestore}}%
\def\swapaxes{\addto@pscode{-90 rotate -1 1 scale}}%
\def\stroke{\def\pst@par{}\pst@object{stroke}}%
\def\fill{\def\pst@par{}\pst@object{fill}}%
\def\openshadow{\def\pst@par{}\pst@object{openshadow}}%
\def\closedshadow{\def\pst@par{}\pst@object{closedshadow}}%
\def\movepath(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor tx@Shadow}}%
\def\lineto{\pst@onecoor{lineto}}%
\def\rlineto{\pst@onecoor{rlineto}}%
\def\curveto{\pst@threecoor{curveto}}%
\def\rcurveto{\pst@threecoor{rcurveto}}%
\def\code#1{\addto@pscode{#1}}%
\def\coor(#1){\pst@@getcoor{#1}\addto@pscode\pst@coor\@ifnextchar({\coor}{}}%
\def\rcoor{\pst@getcoors{}{}}%
\def\dim#1{\pssetlength\pst@dimg{#1}\addto@pscode{\pst@number\pst@dimg}}%
\def\setcolor#1{%
\@ifundefined{color@#1}{}{\addto@pscode{\use@color{#1}}}}%
\def\arrows#1{{\psset@arrows{#1}\pst@addarrowdef}}%
\let\file\pst@rawfile
} % END \pst@customdefs
\def\closedshadow@i{\cuse@par\pst@closedshadow}
\def\openshadow@i{\cuse@par\pst@openshadow}
\def\stroke@i{\cuse@par\pst@stroke}%
\def\fill@i{\cuse@par\pst@fill}%
\def\pst@onecoor#1(#2){%
\pst@@getcoor{#2}%
\addto@pscode{\pst@coor #1}}
\def\pst@threecoor#1(#2)#3(#4)#5(#6){%
\begingroup
\pst@getcoor{#2}\pst@tempa
\pst@getcoor{#4}\pst@tempb
\pst@getcoor{#6}\pst@tembc
\addto@pscode{\pst@tempa \pst@tempb \pst@tempc #1}%
\endgroup}
\def\pst@rawfile#1{%
\begingroup
\def\do##1{\catcode`##1=12\relax}"
\dospecials
\catcode`\%=14
\pst@@rawfile{#1}%
\endgroup}
\def\pst@@rawfile#1{%
\immediate\openin1 #1
\ifeof1
\@pstrickserr{File `#1' not found}\@ehpa
\else
\immediate\read1 to \pst@tempg
\loop
\ifeof1 \@pstfalse\else\@psttrue\fi
\if@pst
\addto@pscode\pst@tempg
\immediate\read1 to \pst@tempg
\repeat
\fi
\immediate\closein1\relax}
\def\tx@SD{SD }
\def\tx@SQ{SQ }
\def\tx@ST{ST }
\def\tx@SP{SP }
\@namedef{psds@*}{/Dot { 0 0 DS \tx@SD } def}
\@namedef{psds@o}{%
/r2 DS CLW sub def
/Dot { 0 0 DS \tx@SD \pst@usecolor\psfillcolor 0 0 r2 \tx@SD } def}
\@namedef{psds@square*}{%
/r1 DS .886 mul def
/Dot { r1 \tx@SQ } def}
\@namedef{psds@square}{%
/r1 DS .886 mul def /r2 r1 CLW sub def
/Dot { r1 \tx@SQ \pst@usecolor\psfillcolor r2 \tx@SQ } def}
\@namedef{psds@triangle*}{%
/y1 DS .778 mul neg def /x1 y1 1.732 mul neg def
/Dot { x1 y1 \tx@ST } def}
\@namedef{psds@triangle}{%
/y1 DS .778 mul neg def /x1 y1 1.732 mul neg def
/y2 y1 CLW add def /x2 y2 1.732 mul neg def
/Dot { x1 y1 \tx@ST \pst@usecolor\psfillcolor x2 y2 \tx@ST } def}
\@namedef{psds@pentagon*}{%
/r1 DS 1.149 mul def
/Dot { r1 \tx@SP } def}
\@namedef{psds@pentagon}{%
DS .93 mul dup 1.236 mul /r1 ED CLW sub 1.236 mul /r2 ED
/Dot { r1 \tx@SP \pst@usecolor\psfillcolor
r2 \tx@SP } def}
\@namedef{psds@+}{%
/DS DS 1.253 mul def
/Dot { DS 0 moveto DS neg 0 L stroke
0 DS moveto 0 DS neg L stroke } def}
\@namedef{psds@|}{%
\psk@tbarsize CLW mul add 2 div /DS ED
/Dot { 0 DS moveto 0 DS neg L stroke } def}
\def\psset@dotstyle#1{%
\@ifundefined{psds@#1}%
{\@pstrickserr{Dot style `#1' not defined}\@eha}%
{\edef\psk@dotstyle{#1}}}
\psset@dotstyle{*}
\def\tx@NArray{NArray }
\def\tx@NArray{NArray }
\def\tx@Line{Line }
\def\tx@Arcto{Arcto }
\def\tx@CheckClosed{CheckClosed }
\def\tx@Polygon{Polygon }
\def\tx@CCA{CCA }
\def\tx@CCA{CCA }
\def\tx@CC{CC }
\def\tx@IC{IC }
\def\tx@BOC{BOC }
\def\tx@NC{NC }
\def\tx@EOC{EOC }
\def\tx@BAC{BAC }
\def\tx@NAC{NAC }
\def\tx@EAC{EAC }
\def\tx@OpenCurve{OpenCurve }
\def\tx@AltCurve{AltCurve }
\def\tx@ClosedCurve{ClosedCurve }
\def\psset@curvature#1{%
\edef\pst@tempg{#1 }%
\expandafter\psset@@curvature\pst@tempg * * * \@nil}
\def\psset@@curvature#1 #2 #3 #4\@nil{%
\pst@checknum{#1}\pst@tempg
\pst@checknum{#2}\pst@temph
\pst@checknum{#3}\pst@tempi
\edef\psk@curvature{\pst@tempg \pst@temph \pst@tempi}}
\psset@curvature{1 .1 0}
\def\pscurve{\def\pst@par{}\pst@object{pscurve}}
\def\pscurve@i{%
\pst@getarrows{%
\begin@OpenObj
\pst@getcoors[\pscurve@ii}}
\def\pscurve@ii{%
\addto@pscode{%
\pst@cp
\psk@curvature\space /c ED /b ED /a ED
\ifshowpoints true \else false \fi
\tx@OpenCurve}%
\end@OpenObj}
\def\psecurve{\def\pst@par{}\pst@object{psecurve}}
\def\psecurve@i{%
\pst@getarrows{%
\begin@OpenObj
\pst@getcoors[\psecurve@ii}}
\def\psecurve@ii{%
\addto@pscode{%
\psk@curvature\space /c ED /b ED /a ED
\ifshowpoints true \else false \fi
\tx@AltCurve}%
\end@OpenObj}
\def\psccurve{\def\pst@par{}\pst@object{psccurve}}
\def\psccurve@i{%
\begin@ClosedObj
\pst@getcoors[\psccurve@ii}
\def\psccurve@ii{%
\addto@pscode{%
\psk@curvature\space /c ED /b ED /a ED
\ifshowpoints true \else false \fi
\tx@ClosedCurve}%
\def\pst@linetype{1}%
\end@ClosedObj}
\def\psset@dotsize#1{%
\edef\pst@tempg{#1 }%
\expandafter\psset@@dotsize\pst@tempg -1 -1 -1\@nil}
\def\psset@@dotsize#1 #2 #3\@nil{%
\pst@checknum{#2}\pst@tempg
\pssetlength\pst@dimg{#1}%
\edef\psk@dotsize{%
/DS \pst@number\pst@dimg \pst@tempg CLW mul add 2 div def }}
\psset@dotsize{.5pt 2.5}
\def\psset@dotscale#1{\pst@getscale{#1}\psk@dotscale}
\psset@dotscale{1}
\def\pst@Getangle#1#2{%
\pst@getangle{#1}\pst@tempg
\def\pst@temph{0. }%
\ifx\pst@tempg\pst@temph
\def#2{}%
\else
\edef#2{\pst@tempg\space rotate }%
\fi}
\def\psset@dotangle#1{\pst@Getangle{#1}\psk@dotangle}
\psset@dotangle{0}
\def\psdots{\def\pst@par{}\pst@object{psdots}}
\def\psdots@i{%
\begin@SpecialObj
\pst@getcoors[\psdots@ii}
\def\psdots@ii{%
\addto@pscode{false \tx@NArray \psdots@iii}%
\end@SpecialObj}
\def\psdots@iii{%
\psk@dotsize
\@nameuse{psds@\psk@dotstyle}
newpath
n { gsave T \psk@dotangle \psk@dotscale Dot grestore } repeat}
\def\tx@EndDot{EndDot }
\def\psas@oo{{\pst@usecolor\psfillcolor true} true \psk@dotsize \tx@EndDot}
\def\psas@o{{\pst@usecolor\psfillcolor true} false \psk@dotsize \tx@EndDot}
\@namedef{psas@**}{{false} true \psk@dotsize \tx@EndDot}
\@namedef{psas@*}{{false} false \psk@dotsize \tx@EndDot}
\newdimen\pslinearc
\def\psset@linearc#1{\pssetlength\pslinearc{#1}}
\psset@linearc{0pt}
\def\psline{\def\pst@par{}\pst@object{psline}}
\def\psline@i{%
\pst@getarrows{%
\begin@OpenObj
\pst@getcoors[\psline@ii}}
\def\psline@ii{%
\addto@pscode{\pst@cp \psline@iii \tx@Line}%
\end@OpenObj}
\def\psline@iii{%
\ifdim\pslinearc>\z@
/r \pst@number\pslinearc def
/Lineto { \tx@Arcto } def
\else
/Lineto /lineto load def
\fi
\ifshowpoints true \else false \fi}
\def\qline(#1)(#2){%
\def\pst@par{}%
\begin@SpecialObj
\def\pst@linetype{0}%
\pst@getcoor{#1}\pst@tempa
\pst@@getcoor{#2}%
\addto@pscode{%
\pst@tempa moveto \pst@coor L
\@nameuse{psls@\pslinestyle}}%
\end@SpecialObj}
\def\pspolygon{\def\pst@par{}\pst@object{pspolygon}}
\def\pspolygon@i{%
\begin@ClosedObj
\def\pst@cp{}%
\pst@getcoors[\pspolygon@ii}
\def\pspolygon@ii{%
\addto@pscode{\psline@iii \tx@Polygon}%
\def\pst@linetype{1}%
\end@ClosedObj}
\def\psset@framearc#1{\pst@checknum{#1}\psk@framearc}
\psset@framearc{0}
\def\psset@cornersize#1{%
\pst@expandafter\psset@@cornersize{#1}\@nil}
\def\psset@@cornersize#1#2\@nil{%
\if #1a\relax
\def\psk@cornersize{\pst@number\pslinearc false }%
\else
\def\psk@cornersize{\psk@framearc true }%
\fi}
\psset@cornersize{relative}
\def\tx@Rect{Rect }
\def\tx@OvalFrame{OvalFrame }
\def\tx@Frame{Frame }
\def\psset@dimen#1{%
\pst@expandafter\psset@@dimen{#1}\@nil}
\def\psset@@dimen#1#2\@nil{%
\if #1o\relax
\def\psk@dimen{.5 }%
\else
\if #1m\relax
\def\psk@dimen{0 }%
\else
\if #1i\relax
\def\psk@dimen{-.5 }%
\fi
\fi
\fi}
\psset@dimen{outer}
\def\psframe{\def\pst@par{}\pst@object{psframe}}
\def\psframe@i(#1){%
\@ifnextchar({\psframe@ii(#1)}{\psframe@ii(0,0)(#1)}}
\def\psframe@ii(#1)(#2){%
\begin@ClosedObj
\pst@getcoor{#1}\pst@tempa
\pst@@getcoor{#2}%
\addto@pscode{\psk@cornersize \pst@tempa \pst@coor \psk@dimen \tx@Frame}%
\def\pst@linetype{2}%
\showpointsfalse
\end@ClosedObj}
\def\psbezier{\def\pst@par{}\pst@object{psbezier}}
\def\psbezier@i{\pst@getarrows\psbezier@ii}
\def\psbezier@ii#1(#2)#3(#4)#5(#6){%
\@ifnextchar({\psbezier@iii{1}(#2)(#4)(#6)}%
{\psbezier@iii{\z@}(0,0)(#2)(#4)(#6)}}
\def\psbezier@iii#1(#2)(#3)(#4)(#5){%
\begin@OpenObj
\pst@getcoor{#2}\pst@tempa
\pst@getcoor{#3}\pst@tempb
\pst@getcoor{#4}\pst@tempc
\pst@getcoor{#5}\pst@tempd
\pst@optcp{#1}\pst@tempa
\ifshowpoints\psbezier@iv\fi
\addto@pscode{
\pst@tempb \pst@tempa ArrowA
\pst@tempc \pst@tempd ArrowB
curveto}%
\end@OpenObj}
\def\psbezier@iv{%
\addto@pscode{%
gsave
\pst@tempa \pst@tempb \pst@tempc \pst@tempd
newpath moveto L L L
CLW 2 div SLW
[ \psk@dash\space ] 0 setdash stroke
grestore
/Points [\pst@tempa\pst@tempb\pst@tempc\pst@tempd] def}}
\def\tx@Parab{Parab }
\def\parabola{\def\pst@par{}\pst@object{parabola}}
\def\parabola@i{\pst@getarrows\parabola@ii}
\def\parabola@ii#1(#2)#3(#4){%
\begin@OpenObj
\pst@getcoor{#2}\pst@tempa
\pst@@getcoor{#4}%
\addto@pscode{\pst@tempa \pst@coor \tx@Parab}%
\end@OpenObj}
\def\psset@gridwidth#1{\pst@getlength{#1}\psk@gridwidth}
\psset@gridwidth{.8pt}
\def\psset@griddots#1{%
\pst@cntg=#1\relax
\edef\psk@griddots{\the\pst@cntg}}
\psset@griddots{0}
\def\psset@gridcolor#1{\pst@getcolor{#1}\psgridcolor}
\psset@gridcolor{black}
\def\psset@subgridwidth#1{\pst@getlength{#1}\psk@subgridwidth}
\psset@subgridwidth{.4pt}
\def\psset@subgridcolor#1{\pst@getcolor{#1}\pssubgridcolor}
\psset@subgridcolor{gray}
\def\psset@subgriddots#1{%
\pst@cntg=#1\relax\edef\psk@subgriddots{\the\pst@cntg}}
\psset@subgriddots{0}
\def\psset@subgriddiv#1{%
\pst@cntg=#1\relax\edef\psk@subgriddiv{\the\pst@cntg}}
\psset@subgriddiv{5}
\def\psset@gridlabels#1{\pst@getlength{#1}\psk@gridlabels}
\psset@gridlabels{10pt}
\def\psset@gridlabelcolor#1{\pst@getcolor{#1}\psgridlabelcolor}
\psset@gridlabelcolor{black}
\def\tx@Grid{Grid }
\def\psgrid{\def\pst@par{}\pst@object{psgrid}}
\def\psgrid@i{\@ifnextchar(%
{\psgrid@ii}{\expandafter\psgrid@iv\pic@coor}}
\def\psgrid@ii(#1){\@ifnextchar(%
{\psgrid@iii(#1)}{\psgrid@iv(0,0)(0,0)(#1)}}
\def\psgrid@iii(#1)(#2){\@ifnextchar(%
{\psgrid@iv(#1)(#2)}{\psgrid@iv(#1)(#1)(#2)}}
\def\psgrid@iv(#1)(#2)(#3){%
\begin@SpecialObj
\pst@getcoor{#1}\pst@tempa
\pst@getcoor{#2}\pst@tempb
\pst@@getcoor{#3}%
\ifnum\psk@subgriddiv>1
\addto@pscode{gsave
\psk@subgridwidth SLW \pst@usecolor\pssubgridcolor
\pst@tempb \pst@coor \pst@tempa
\pst@number\psxunit \pst@number\psyunit
\psk@subgriddiv\space \psk@subgriddots\space
{} 0 \tx@Grid grestore}%
\fi
\addto@pscode{gsave
\psk@gridwidth SLW \pst@usecolor\psgridcolor
\pst@tempb \pst@coor \pst@tempa
\pst@number\psxunit \pst@number\psyunit
1 \psk@griddots\space { \pst@usecolor\psgridlabelcolor }
\psk@gridlabels \tx@Grid grestore}%
\end@SpecialObj}
\newif\ifpsmathbox
\psmathboxtrue
\def\pst@mathflag{\z@}
\newtoks\everypsbox
\long\def\pst@makenotverbbox#1#2{%
\edef\pst@mathflag{%
\ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else \z@\fi\else \z@\fi}%
\setbox\pst@hbox=\hbox{%
\ifcase\pst@mathflag\or$\m@th\textstyle\or$\m@th\displaystyle\fi
{\the\everypsbox#2}%
\ifnum\pst@mathflag>\z@$\fi}%
#1}
\def\pst@makeverbbox#1{%
\def\pst@afterbox{#1}%
\edef\pst@mathflag{%
\ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else \z@\fi\else \z@\fi}%
\afterassignment\pst@beginbox
\setbox\pst@hbox\hbox}
\def\pst@beginbox{%
\ifcase\pst@mathflag\or$\m@th\or$\m@th\displaystyle\fi
\bgroup\aftergroup\pst@endbox
\the\everypsbox}
\def\pst@endbox{%
\ifnum\pst@mathflag>\z@$\fi
\egroup
\pst@afterbox}
\def\pst@makebox{\pst@@makebox}
\def\psverbboxtrue{\def\pst@@makebox{\pst@makeverbbox}}
\def\psverbboxfalse{\def\pst@@makebox{\pst@makenotverbbox}}
\psverbboxfalse
\def\pst@longbox{%
\def\pst@makebox{%
\gdef\pst@makebox{\pst@@makebox}%
\pst@makelongbox}}
\def\pst@makelongbox#1{%
\def\pst@afterbox{#1}%
\edef\pst@mathflag{%
\ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else \z@\fi\else \z@\fi}%
\setbox\pst@hbox\hbox\bgroup
\aftergroup\pst@afterbox
\ifcase\pst@mathflag\or$\m@th\or$\m@th\displaystyle\fi
\begingroup
\the\everypsbox}
\def\pst@endlongbox{%
\endgroup
\ifnum\pst@mathflag>\z@$\fi
\egroup}
\def\pslongbox#1#2{%
\@namedef{#1}{\pst@longbox#2}%
\@namedef{end#1}{\pst@endlongbox}}
\newdimen\psframesep
\def\psset@framesep#1{\pssetlength\psframesep{#1}}
\psset@framesep{3pt}
\newif\ifpsboxsep
\def\psset@boxsep#1{\@nameuse{psboxsep#1}}
\psset@boxsep{true}
\def\pst@useboxpar{%
\use@par
\if@star
\let\pslinecolor\psfillcolor
\solid@star
\let\solid@star\relax
\fi
\ifpsdoubleline \pst@setdoublesep \fi}
\def\psframebox{\def\pst@par{}\pst@object{psframebox}}
\def\psframebox@i{\pst@makebox\psframebox@ii}
\def\psframebox@ii{%
\begingroup
\pst@useboxpar
\pst@dima=\pslinewidth
\advance\pst@dima by \psframesep
\pst@dimc=\wd\pst@hbox\advance\pst@dimc by \pst@dima
\pst@dimb=\dp\pst@hbox\advance\pst@dimb by \pst@dima
\pst@dimd=\ht\pst@hbox\advance\pst@dimd by \pst@dima
\setbox\pst@hbox=\hbox{%
\ifpsboxsep\kern\pst@dima\fi
\begin@ClosedObj
\addto@pscode{%
\psk@cornersize
\pst@number\pst@dima neg
\pst@number\pst@dimb neg
\pst@number\pst@dimc
\pst@number\pst@dimd
.5
\tx@Frame}%
\def\pst@linetype{2}%
\showpointsfalse
\end@ClosedObj
\box\pst@hbox
\ifpsboxsep\kern\pst@dima\fi}%
\ifpsboxsep\dp\pst@hbox=\pst@dimb\ht\pst@hbox=\pst@dimd\fi
\leavevmode\box\pst@hbox
\endgroup}
\def\psdblframebox{\def\pst@par{}\pst@object{psdblframebox}}
\def\psdblframebox@i{\addto@par{doubleline=true}\psframebox@i}
\def\psclip#1{%
\leavevmode
\begingroup
\begin@psclip
\begingroup
\def\use@pscode{%
\pstVerb{%
\pst@dict
/mtrxc CM def
CP CP T
\tx@STV
\psk@origin
\psk@swapaxes
newpath
\pst@code
clip
newpath
mtrxc setmatrix
moveto
0 setgray
end}%
\gdef\pst@code{}}%
\def\@multips(##1)(##2)##3##4{\pst@misplaced\multips}%
\def\nc@object##1##2##3##4{\pst@misplaced{node connection}}%
\hbox to\z@{#1}%
\endgroup
\def\endpsclip{%
\end@psclip
\endgroup}%
\ignorespaces}
\def\endpsclip{\pst@misplaced\endpsclip}
\let\begin@psclip\relax
\def\end@psclip{\pstVerb{currentpoint initclip moveto}}
\def\AltClipMode{%
\def\end@psclip{\pstVerb{\pst@grestore}}%
\def\begin@psclip{\pstVerb{gsave}}}
\def\clipbox{\@ifnextchar[{\psclipbox@}{psclipbox@[\z@]}}
\def\clipbox@[#1]{\pst@makebox\psclipbox@@{#1}}
\def\clipbox@@#1{%
\pssetlength\pst@dimg{#1}%
\leavevmode\hbox{%
\begin@psclip
\pst@Verb{%
CM \tx@STV CP T newpath
/a \pst@number\pst@dimg def
/w \pst@number{\wd\pst@hbox}a add def
/d \pst@number{\dp\pst@hbox}a add neg def
/h \pst@number{\ht\pst@hbox}a add def
a neg d moveto
a neg h L
w h L
w d L
closepath
clip
newpath
0 0 moveto
setmatrix}%
\unhbox\pst@hbox
\end@psclip}}
\def\psshadowbox{%
\def\pst@par{}\pst@object{psshadowbox}}
\def\psshadowbox@i{\pst@makebox\psshadowbox@ii}
\def\psshadowbox@ii{%
\begingroup
\pst@useboxpar
\psshadowtrue
\psboxseptrue
\def\psk@shadowangle{-45 }%
\setbox\pst@hbox=\hbox{\psframebox@ii}%
\pst@dimh=\psk@shadowsize\p@
\pst@dimh=.7071\pst@dimh
\pst@dimg=\dp\pst@hbox
\advance\pst@dimg\pst@dimh
\dp\pst@hbox=\pst@dimg
\pst@dimg=\wd\pst@hbox
\advance\pst@dimg\pst@dimh
\wd\pst@hbox=\pst@dimg
\leavevmode
\box\pst@hbox
\endgroup}
\def\pscirclebox{\def\pst@par{}\pst@object{pscirclebox}}
\def\pscirclebox@i{\pst@makebox{\pscirclebox@ii{}}}
\def\pscirclebox@ii#1{%
\begingroup
\pst@useboxpar
\setbox\pst@hbox=\hbox{#1\pscirclebox@iii\box\pst@hbox}%
\ifpsboxsep
\pst@dima=.5\wd\pst@hbox
\pst@pyth\pst@dima\pst@dimb\pst@dimc
\advance\pst@dimc\pslinewidth
\advance\pst@dimc\psframesep
\setbox\pst@hbox=\hbox to2\pst@dimc{%
\hss
\vbox{\vskip\pst@dimc\vskip-\pst@dimb\box\pst@hbox}%
\hss}%
\advance\pst@dimc-\pst@dimb
\dp\pst@hbox=\pst@dimc
\fi
\leavevmode\box\pst@hbox
\endgroup}
\def\pscirclebox@iii{%
\if@star
\pslinewidth\z@
\pstverb{\pst@dict \tx@STP \pst@usecolor\psfillcolor
newpath \pscirclebox@iv \tx@SD end}%
\else
\begin@ClosedObj
\def\pst@linetype{4}\showpointsfalse
\addto@pscode{%
\pscirclebox@iv CLW 2 div add 0 360 arc closepath}%
\end@ClosedObj
\fi}
\def\pscirclebox@iv{%
\pst@number{\wd\pst@hbox}2 div
\pst@number{\ht\pst@hbox}\pst@number{\dp\pst@hbox}add 2 div
2 copy \pst@number{\dp\pst@hbox}sub 4 2 roll
\tx@Pyth \pst@number\psframesep add }
\def\psovalbox{\def\pst@par{}\pst@object{psovalbox}}
\def\psovalbox@i{\pst@makebox{\psovalbox@ii{}}}
\def\psovalbox@ii#1{%
\begingroup
\pst@useboxpar
\pst@dimd=.707\pslinewidth\advance\pst@dimd by 1.414\psframesep
\pst@dimg=\ht\pst@hbox\advance\pst@dimg\dp\pst@hbox
\pst@dimb=.707\pst@dimg\advance\pst@dimb\pst@dimd
\pst@dima=.707\wd\pst@hbox\advance\pst@dima\pst@dimd
\setbox\pst@hbox=\hbox{#1\psovalbox@iii\box\pst@hbox}%
\ifpsboxsep
\setbox\pst@hbox\hbox to 2\pst@dima{\hss\unhbox\pst@hbox\hss}%
\advance\pst@dimb-.5\pst@dimg
\pst@dimg\ht\pst@hbox
\advance\pst@dimg\pst@dimb
\ht\pst@hbox=\pst@dimb
\pst@dimg=\dp\pst@hbox
\advance\pst@dimg\pst@dimb
\dp\pst@hbox=\pst@dimb
\fi
\leavevmode\box\pst@hbox
\endgroup}
\def\psovalbox@iii{%
\begin@ClosedObj
\addto@pscode{%
0 360
\pst@number\pst@dima \pst@number\pst@dimb
\pst@number{\wd\pst@hbox}2 div
\pst@number\pst@dimg 2 div \pst@number{\dp\pst@hbox}sub
\tx@Ellipse
closepath}%
\def\pst@linetype{2}%
\end@ClosedObj}
\def\psset@arcsepA#1{\pst@getlength{#1}\psk@arcsepA}
\def\psset@arcsepB#1{\pst@getlength{#1}\psk@arcsepB}
\def\psset@arcsep#1{%
\psset@arcsepA{#1}\let\psk@arcsepB\psk@arcsepA}
\psset@arcsep{0}
\def\tx@ArcArrow{ArcArrow }
\def\psarc{\def\pst@par{}\pst@object{psarc}}
\def\psarc@i{%
\@ifnextchar({\psarc@iii}{\psarc@ii}}
\def\psarc@ii#1{\addto@par{arrows=#1}%
\@ifnextchar({\psarc@iii}{\psarc@iii(0,0)}}
\def\psarc@iii(#1)#2#3#4{%
\begin@OpenObj
\pst@getangle{#3}\pst@tempa
\pst@getangle{#4}\pst@tempb
\pst@@getcoor{#1}%
\pssetlength\pst@dima{#2}%
\addto@pscode{\psarc@iv \psarc@v}%
\gdef\psarc@type{0}%
\showpointsfalse
\end@OpenObj}
\def\psarc@iv{%
\pst@coor /y ED /x ED
/r \pst@number\pst@dima def
/c 57.2957 r \tx@Div def
/angleA
\pst@tempa
\psk@arcsepA c mul 2 div
\ifcase \psarc@type add \or sub \fi
def
/angleB
\pst@tempb
\psk@arcsepB c mul 2 div
\ifcase \psarc@type sub \or add \fi
def
\ifshowpoints\psarc@showpoints\fi
\ifx\psk@arrowA\@empty
\ifnum\psk@liftpen=2
r angleA \tx@PtoC
y add exch x add exch
moveto
\fi
\fi}
\def\psarc@v{%
x y r
angleA
\ifx\psk@arrowA\@empty\else
{ ArrowA CP }
{ \ifcase\psarc@type add \or sub \fi }
\tx@ArcArrow
\fi
angleB
\ifx\psk@arrowB\@empty\else
{ ArrowB }
{ \ifcase\psarc@type sub \or add \fi }
\tx@ArcArrow
\fi
\ifcase\psarc@type arc \or arcn \fi}
\def\psarc@type{0}
\def\psarc@showpoints{%
gsave
newpath
x y moveto
x y r \pst@tempa \pst@tempb
\ifcase\psarc@type arc \or arcn \fi
closepath
CLW 2 div SLW
[ \psk@dash\space ] 0 setdash stroke
grestore }
\def\psarcn{\def\pst@par{}\pst@object{psarcn}}
\def\psarcn@i{\def\psarc@type{1}\psarc@i}
\def\pscircle{\def\pst@par{}\pst@object{pscircle}}
\def\pscircle@i{\@ifnextchar({\pscircle@do}{\pscircle@do(0,0)}}
\def\pscircle@do(#1)#2{%
\if@star
{\use@par\qdisk(#1){#2}}%
\else
\begin@ClosedObj
\pst@@getcoor{#1}%
\pssetlength\pst@dimc{#2}%
\def\pst@linetype{4}%
\addto@pscode{%
\pst@coor
\pst@number\pst@dimc
\psk@dimen CLW mul sub
0 360 arc
closepath}%
\showpointsfalse
\end@ClosedObj
\fi
\ignorespaces}
\def\qdisk(#1)#2{%
\def\pst@par{}%
\begin@SpecialObj
\pst@@getcoor{#1}%
\pssetlength\pst@dimg{#2}%
\addto@pscode{\pst@coor \pst@number\pst@dimg \tx@SD}%
\end@SpecialObj}
\def\pswedge{\def\pst@par{}\pst@object{pswedge}}
\def\pswedge@i{\@ifnextchar({\pswedge@ii}{\pswedge@ii(0,0)}}
\def\pswedge@ii(#1)#2#3#4{%
\begin@ClosedObj
\pssetlength\pst@dimc{#2}
\pst@getangle{#3}\pst@tempa
\pst@getangle{#4}\pst@tempb
\pst@@getcoor{#1}%
\def\pst@linetype{1}%
\addto@pscode{%
\pst@coor
2 copy
moveto
\pst@number\pst@dimc \psk@dimen CLW mul sub % Adjusted radius
\pst@tempa \pst@tempb
arc
closepath}%
\showpointsfalse
\end@ClosedObj}
\def\tx@Ellipse{Ellipse }
\def\psellipse{\def\pst@par{}\pst@object{psellipse}}
\def\psellipse@i(#1){\@ifnextchar(%
{\psellipse@ii(#1)}{\psellipse@ii(0,0)(#1)}}
\def\psellipse@ii(#1)(#2){%
\begin@ClosedObj
\pst@getcoor{#1}\pst@tempa
\pst@@getcoor{#2}%
\addto@pscode{%
0 360
\pst@coor
\ifdim\psk@dimen\p@=\z@\else
\psk@dimen CLW mul dup 3 1 roll
sub 3 1 roll sub exch
\fi
\pst@tempa
\tx@Ellipse
closepath}%
\def\pst@linetype{2}%
\end@ClosedObj}
\def\multirput{%
\begingroup\pst@getref{\pst@getrputrot\multirput@i}}
\def\multirput@i(#1){\@ifnextchar(%
{\multirput@ii(#1)}{\multirput@ii(0,0)(#1)}}
\def\multirput@ii(#1,#2)(#3,#4)#5{%
\pst@makebox{\multirput@iii(#1,#2)(#3,#4){#5}}}
\def\multirput@iii(#1,#2)(#3,#4)#5{%
\pst@makesmall\pst@hbox
\ifx\pst@rot\@empty\else\pst@rotate\pst@hbox\fi
\pssetxlength\pst@dima{#1}\pssetylength\pst@dimb{#2}
\pssetxlength\pst@dimc{#3}\pssetylength\pst@dimd{#4}
\pst@cntg=#5\relax\pst@cnth=0\relax
\leavevmode
\loop\ifnum\pst@cntg>\pst@cnth
\vbox to \z@{\vss\hbox to \z@{%
\kern\pst@dima\copy\pst@hbox\hss}\vskip\pst@dimb}%
\advance\pst@dima by\pst@dimc
\advance\pst@dimb by\pst@dimd
\advance\pst@cnth by 1
\repeat
\endgroup\ignorespaces}
\def\multips{\begingroup\pst@getrputrot\multips@i}
\def\multips@i(#1){\@ifnextchar({\@multips@ii(#1)}{\@multips@ii(0,0)(#1)}}
\def\@multips@ii(#1)(#2)#3#4{%
\pst@getcoor{#1}\pst@tempa
\pst@@getcoor{#2}%
\pst@cnta=#3\relax
\addto@pscode{%
\pst@tempa T \the\pst@cnta\space \pslbrace
gsave \ifx\pst@rot\@empty\else\pst@rot rotate \fi }%
\hbox to\z@{%
\def\init@pscode{%
\addto@pscode{%
gsave
\pst@number\pslinewidth SLW
\pst@usecolor\pslinecolor}}%
\def\use@pscode{\addto@pscode{grestore}}%
\def\psclip##1{\pst@misplaced\psclip}%
\def\nc@object##1##2##3##4{\pst@misplaced{node connection}}%
#4}%
\addto@pscode{grestore \pst@coor T \psrbrace repeat}%
\leavevmode
\use@pscode
\endgroup
\ignorespaces}
\def\scalebox#1{%
\begingroup
\pst@getscale{#1}\pst@tempa
\pst@makebox{\@scalebox}}
\def\@scalebox{%
\leavevmode
\ifx\pst@tempa\@empty
\box\pst@hbox
\else
\hbox{%
\ht\pst@hbox=\pst@temph\ht\pst@hbox%
\dp\pst@hbox=\pst@temph\dp\pst@hbox%
\pst@dima=\pst@tempg\wd\pst@hbox%
\ifdim\pst@dima<\z@\kern-\pst@dima\fi
\pst@Verb{CP CP T \pst@tempa \tx@NET}%
\hbox to \z@{\box\pst@hbox\hss}%
\pst@Verb{%
CP CP T
1 \pst@tempg\space div 1 \pst@temph\space div scale
\tx@NET}%
\ifdim\pst@dima>\z@\kern\pst@dima\fi}%
\fi
\endgroup}
\pslongbox{Scalebox}{\scalebox}
\def\scaleboxto(#1,#2){%
\begingroup
\pssetlength\pst@dima{#1}%
\pssetlength\pst@dimb{#2}%
\pst@makebox{\@scaleboxto\@scalebox}}
\def\@scaleboxto{%
\ifdim\pst@dima=\z@\else
\pst@divide{\pst@dima}{\wd\pst@hbox}\pst@tempg
\fi
\ifdim\pst@dimb=\z@
\let\pst@temph\pst@tempg
\else
\pst@dimc=\ht\pst@hbox\advance\pst@dimc\dp\pst@hbox
\pst@divide{\pst@dimb}{\pst@dimc}\pst@temph
\ifdim\pst@dima=\z@\let\pst@tempg\pst@temph\fi
\fi
\edef\pst@tempa{\pst@tempg\space\pst@temph\space scale }%
\ifdim\pst@dima=\z@
\ifdim\pst@dimb=\z@
\@pstrickserr{%
\string\scaleboxto\space dimensions cannot both be zero}\@ehpa
\def\pst@tempa{}%
\fi\fi}
\pslongbox{Scaleboxto}{\scaleboxto}
\def\tx@Rot{Rot }
\def\rotateleft{\pst@makebox{\@rotateleft\pst@hbox}}
\def\@rotateleft#1{%
\leavevmode\hbox{\hskip\ht#1\hskip\dp#1\vbox{\vskip\wd#1%
\pst@Verb{90 \tx@Rot}
\vbox to \z@{\vss\hbox to \z@{\box#1\hss}\vskip\z@}%
\pst@Verb{-90 \tx@Rot}}}}
\def\rotateright{\pst@makebox{\@rotateright\pst@hbox}}
\def\@rotateright#1{%
\hbox{\hskip\ht#1\hskip\dp#1\vbox{\vskip\wd#1%
\pst@Verb{-90 \tx@Rot}
\vbox to \z@{\hbox to \z@{\hss\box#1}\vss}%
\pst@Verb{90 \tx@Rot}}}}
\def\rotatedown{\pst@makebox{\@rotatedown\pst@hbox}}
\def\@rotatedown#1{%
\hbox{\hskip\wd#1\vbox{\vskip\ht#1\vskip\dp#1%
\pst@Verb{180 \tx@Rot}%
\vbox to \z@{\hbox to \z@{\box#1\hss}\vss}%
\pst@Verb{-180 \tx@Rot}}}}
\pslongbox{Rotateleft}{\rotateleft}
\pslongbox{Rotateright}{\rotateright}
\pslongbox{Rotatedown}{\rotatedown}
\def\pst@getref#1{%
\@ifnextchar[%
{\def\refpoint@x{.5}\def\refpoint@y{.5}\pst@@getref{#1}}%
{\let\refpoint@x\relax#1}}
\def\pst@@getref#1[#2]{%
\pst@expandafter\pst@@@getref{#2}\@empty,,\@nil#1}
\def\pst@@@getref#1#2,#3,#4\@nil{%
\ifx\@empty#3\@empty
\@nameuse{getref@#1}\@nameuse{getref@#2}%
\else
\pst@checknum{#1#2}\refpoint@x
\pst@checknum{#3}\refpoint@y
\fi}
\def\getref@t{\def\refpoint@y{1}}
\def\getref@b{\def\refpoint@y{0}}
\def\getref@B{\let\refpoint@y\relax}
\def\getref@l{\def\refpoint@x{0}}
\def\getref@r{\def\refpoint@x{1}}
\def\pst@makesmall#1{%
\ifx\refpoint@x\relax
\setbox#1=\hbox to\z@{\hss\vbox to \z@{\vss\box#1\vss}\hss}%
\else
\pst@@makesmall{#1}%
\fi}
\def\pst@@makesmall#1{%
\pst@dimh=\refpoint@x\wd#1%
\ifx\refpoint@y\relax
\pst@dimg=\dp#1%
\else
\pst@dimg=\refpoint@y\ht#1%
\advance\pst@dimg\refpoint@y\dp#1%
\fi
\setbox#1=\hbox to\z@{%
\hskip-\pst@dimh\vbox to\z@{\vss\box#1\vskip-\pst@dimg}\hss}}
\def\pst@getrputrot#1{%
\@ifnextchar(%
{\def\pst@rot{}#1}%
{\pst@getrot{\@ifnextchar({#1}{#1(0,0)}}}}
\def\pst@getrot#1#2{%
\pst@expandafter{\@ifnextchar*{\pst@@@getrot}{\pst@@getrot}}{#2}\@nil
\ifx\pst@rotlist\@empty\else
\edef\pst@rotlist{\pst@rotlist \pst@rot add }%
\fi
#1}
\def\pst@@getrot#1\@nil{%
\def\next##1@#1=##2@##3\@nil{%
\ifx\relax##2%
\pst@getangle{#1}\pst@rot
\else
\def\pst@rot{##2}%
\fi}%
\expandafter\next\pst@rottable @#1=\relax @\@nil}
\def\pst@@@getrot#1#2\@nil{%
\pst@@getrot#2\@nil
\edef\pst@rot{\pst@rotlist neg \ifx\pst@rot\@empty\else\pst@rot add \fi}}%
\def\pst@rotlist{0 }
\def\pst@rot{}
\def\pst@rottable{%
@0=%
@U=%
@L=90 %
@D=180 %
@R=-90 %
@N=\pst@rotlist neg %
@W=\pst@rotlist neg 90 add %
@S=\pst@rotlist neg 180 add %
@E=\pst@rotlist neg 90 sub }
\def\pst@rotate#1{%
\setbox#1=\hbox{%
\pst@Verb{\pst@rot \tx@Rot}%
\box#1%
\pst@Verb{\pst@rot neg \tx@Rot}}}
\def\psput@cartesian#1{%
\hbox to \z@{\kern\pst@dimg{\vbox to \z@{\vss\box#1\vskip\pst@dimh}\hss}}}
\def\psput@special#1{%
\hbox{%
\pst@Verb{{ \pst@coor } \tx@PutCoor \tx@PutBegin}%
\box#1%
\pst@Verb{\tx@PutEnd}}}
\def\tx@PutCoor{PutCoor }
\def\tx@PutBegin{PutBegin }
\def\tx@PutEnd{PutEnd }
\def\begin@psput#1{\begingroup\pst@killglue\leavevmode\pst@ifstar{#1}}%
\def\end@psput#1(#2){%
\pst@makebox{%
\if@star
\setbox\pst@hbox\hbox{\psframebox*[boxsep=false]{\unhbox\pst@hbox}}%
\fi
#1(#2)%
\endgroup
\ignorespaces}}
\def\rput{\begin@psput{\pst@getref{\pst@getrputrot{\end@psput\rput@i}}}}
\def\rput@i(#1){%
\pst@makesmall\pst@hbox
\ifx\pst@rot\@empty\else\pst@rotate\pst@hbox\fi
\psput@{#1}\pst@hbox}
\def\cput{\def\pst@par{}\pst@object{cput}}
\def\cput@i{\begingroup\pst@killglue\leavevmode\pst@getrputrot\cput@ii}
\def\cput@ii(#1){\pst@makebox{\cput@iii{}(#1)}}
\def\cput@iii#1(#2){%
\setbox\pst@hbox=\hbox{\psboxsepfalse\pscirclebox@ii{#1}}%
\let\refpoint@x\relax
\rput@i(#2)%
\endgroup
\ignorespaces}
\newdimen\pslabelsep
\def\psset@labelsep#1{\pssetlength\pslabelsep{#1}}
\psset@labelsep{5pt}
\def\pst@getrefangle#1\@nil{%
\def\next##1@#1=##2"##3@##4\@nil{%
\ifx\relax##2%
\pst@getangle{#1}\pst@refangle
\def\pst@uputref{}%
\else
\edef\pst@refangle{##2}%
\edef\pst@uputref{##3}%
\fi}%
\expandafter\next\pst@refangletable @#1=\relax"@\@nil}
\def\pst@refangletable{%
@r=0"20%
@u=90"02%
@l=180"10%
@d=-90"01%
@ur=45"22%
@ul=135"12%
@dr=-135"21%
@dl=-45"11}
\def\uput{\begin@psput{\@ifnextchar[{\uput@ii}{\uput@i}}}
\def\uput@i#1{\pssetlength\pslabelsep{#1}\uput@ii}
\def\uput@ii[#1]{%
\pst@expandafter\pst@getrefangle{#1}\@nil
\pst@getrputrot{\end@psput\uput@iii}}
\def\uput@iii(#1){%
\ifx\pst@uputref\@empty
\uput@iv\tx@UUput
\else
\ifx\pst@rot\@empty
\expandafter\uput@v\pst@uputref
\else
\uput@iv\tx@UUput
\fi
\fi
\psput@{#1}\pst@hbox}
\def\uput@iv#1{%
\edef\pst@coor{%
\pst@number\pslabelsep
\pst@number{\wd\pst@hbox}%
\pst@number{\ht\pst@hbox}%
\pst@number{\dp\pst@hbox}%
\pst@refangle\space \ifx\pst@rot\@empty\else\pst@rot\space sub \fi
\tx@Uput #1}%
\setbox\pst@hbox=\hbox to\z@{\hss\vbox to\z@{\vss\box\pst@hbox\vss}\hss}%
\setbox\pst@hbox=\psput@special\pst@hbox
\ifx\pst@rot\@empty\else\pst@rotate\pst@hbox\fi}
\def\uput@v#1#2{%
\ifnum#1>\z@\ifnum#2>\z@\pslabelsep=.707\pslabelsep\fi\fi
\setbox\pst@hbox=\vbox to\z@{%
\ifnum#2=1 \vskip\pslabelsep\else\vss\fi
\hbox to\z@{%
\ifnum#1=2 \hskip\pslabelsep\else\hss\fi
\box\pst@hbox
\ifnum#1=1 \hskip\pslabelsep\else\hss\fi}%
\ifnum#2=2 \vskip\pslabelsep\else\vss\fi}}
\def\tx@Uput{Uput }
\def\tx@UUput{UUput }
\def\pst@getlabelsep#1{%
\@ifnextchar[%
{\def\refpoint@x{.5}\def\refpoint@y{.5}\pst@@getref{#1}}%
{\pst@@getlabelsep{#1}}}
\def\pst@@getlabelsep#1#2{\pssetlength\pslabelsep{#2}\pst@getref{#1}}
\def\Rput{%
\begin@psput{\pst@getlabelsep{\pst@getrputrot{\end@psput{\Rput@i\rput@i}}}}}
\def\Rput@i{%
\pst@dimg=\dp\pst@hbox
\advance\pst@dimg\pslabelsep
\dp\pst@hbox=\pst@dimg
\pst@dimg=\ht\pst@hbox
\advance\pst@dimg\pslabelsep
\ht\pst@hbox=\pst@dimg
\setbox\pst@hbox\hbox{\kern\pslabelsep\box\pst@hbox\kern\pslabelsep}}%
\def\pspicture{\begingroup\pst@ifstar\pst@picture}
\def\pst@picture{%
\@ifnextchar[{\pst@@picture}{\pst@@picture[0]}}
\def\pst@@picture[#1]#2(#3,#4){%
\@ifnextchar({\pst@@@picture[#1](#3,#4)}%
{\pst@@@picture[#1](0,0)(#3,#4)}}
\def\pst@@@picture[#1](#2,#3)(#4,#5){%
\pssetxlength\pst@dima{#2}\pssetylength\pst@dimb{#3}%
\pssetxlength\pst@dimc{#4}\pssetylength\pst@dimd{#5}%
\def\pst@tempa{#1}%
\setbox\pst@hbox=\hbox\bgroup
\begingroup\KillGlue
\@ifundefined{@latexerr}{}{\let\unitlength\psunit}%
\edef\pic@coor{(#2,#3)(#2,#3)(#4,#5)}\ignorespaces}
\def\pic@coor{(0,0)(0,0)(10,10)}
\def\endpspicture{%
\pst@killglue
\endgroup
\egroup
\ifdim\wd\pst@hbox=\z@\else
\@pstrickserr{Extraneous space in the pspicture environment}%
{Type \space <return> \space to procede.}%
\fi
\ht\pst@hbox=\pst@dimd
\dp\pst@hbox=-\pst@dimb
\setbox\pst@hbox=\hbox{%
\kern-\pst@dima
\ifx\pst@tempa\@empty\else
\advance\pst@dimd-\pst@dimb
\pst@dimd=\pst@tempa\pst@dimd
\advance\pst@dimd\pst@dimb
\lower\pst@dimd
\fi
\box\pst@hbox
\kern\pst@dimc}%
\if@star\setbox\pst@hbox=\hbox{\clipbox@@\z@}\fi
\leavevmode\box\pst@hbox
\endgroup}
\@namedef{pspicture*}{\pspicture*}
\@namedef{endpspicture*}{\endpspicture}
\def\tx@BeginOL{BeginOL }
\pst@dimg=40in
\edef\pst@OLunit{\pst@number\pst@dimg}
\def\tx@InitOL{InitOL }
\def\pst@initoverlay#1{\pst@Verb{\tx@InitOL /TheOL (#1) def}}
\def\pst@overlay#1{%
\edef\curr@overlay{#1}%
\pst@Verb{(#1) BOL}%
\aftergroup\pst@endoverlay}
\def\pst@endoverlay{%
\pst@Verb{(\curr@overlay) BOL}}
\def\curr@overlay{all}
\newbox\theoverlaybox
\def\overlaybox{%
\setbox\theoverlaybox=\hbox\bgroup
\begingroup
\let\psoverlay\pst@overlay
\def\overlaybox{%
\@pstrickserr{Overlays cannot be nested}\@eha}%
\def\putoverlaybox{%
\@pstrickserr{You must end the overlay box
before using \string\putoverlaybox}}%
\psoverlay{main}}
\def\endoverlaybox{\endgroup\egroup}
\def\putoverlaybox#1{%
\hbox{\pst@initoverlay{#1}\copy\theoverlaybox}}
\def\psoverlay{\@pstrickserr{\string\psoverlay\space
can only be used after \string\overlaybox}}
\ifx\pstcustomize\relax \input pstricks.con \fi
\catcode`\@=\PstAtCode\relax
\endinput
%%
%% END: pstricks.tex