Fat 4-polytopes and fatter 3-spheres
David Eppstein
We introduce the fatness parameter of a $4$-dimensional polytope $P$, defined as $\phi(P)=(f_1+f_2)/(f_0+f_3)$. It arises in an important open problem in $4$-dimensional combinatorial geometry: Is the fatness of convex $4$-polytopes bounded? We describe and analyze a hyperbolic geometry construction that produces $4$-polytopes with fatness $\phi(P)>\maxfatness$, as well as the first infinite family of $2$-simple, $2$-simplicial $4$-polytopes. Moreover, using a construction via finite covering spaces of surfaces, we show that fatness is not bounded for the more general class of strongly regular CW decompositions of the $3$-sphere.
fat.tex
\documentclass[twocolumn,amsmath,amssymb,aps,secnumarabic,nofootinbib,%
    superscriptaddress,floatfix]{revtex4}
\usepackage{amsthm,times,mathptmx,graphicx,pstricks,pst-node}
\bibliographystyle{hamsplain}

\newtheorem{theorem}{Theorem}
\newtheorem{lemma}[theorem]{Lemma}
\newtheorem{corollary}[theorem]{Corollary}
\newtheorem{proposition}[theorem]{Proposition}
\newtheorem{question}[theorem]{Question}
\theoremstyle{remark}
\newtheorem*{remark}{Remark}
\newcommand{\Hom}{\operatorname{Hom}}
\newcommand{\conv}{\operatorname{conv}}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\R}{\mathbb{R}}
\newcommand{\F}{\mathbb{F}}
\newcommand{\HH}{\mathbb{H}}
\renewcommand{\hat}{\widehat}
\renewcommand{\tilde}{\widetilde}
\renewcommand{\d}{\partial}
\newcommand{\st}{\mathrm{st}}
\newcommand{\hg}{{\hat{g}}}
\newcommand{\hS}{{\hat{S}}}
\newcommand{\pol}{{}^\triangle}
\newcommand{\ppol}{{}^\diamondsuit}
\newcommand{\maxfatness}{5.048}
\newcommand{\eqdef}{\stackrel{\mathrm{def}}{=}}

\newcommand{\eg}{\emph{e.g.}}
\newcommand{\Eg}{\emph{E.g.}}
\newcommand{\ie}{\emph{i.e.}}
\newcommand{\cf}{\emph{cf.}}
\newcommand{\eatline}{\vspace{-\baselineskip}}
\newcommand{\blankline}{\vspace{\baselineskip}}

\renewcommand{\figurename}{Figure}
\newenvironment{fullfigure}[2]
    {\begin{figure}[ht]\begin{center}\def\ffa{#1}\def\ffb{#2}}
    {\vspace{\baselineskip}\caption{\ffb.}\label{\ffa}\end{center}\end{figure}}
\renewcommand{\tablename}{Table}
\renewcommand{\thetable}{\arabic{table}}

\newcommand{\fig}[1]{Figure~\ref{#1}}
\newcommand{\thm}[1]{Theorem~\ref{#1}}
\renewcommand{\sec}[1]{Section~\ref{#1}}
\newcommand{\lem}[1]{Lemma~\ref{#1}}
\newcommand{\prop}[1]{Proposition~\ref{#1}}
\newcommand{\eq}[2]{\begin{equation}\label{#1}#2\end{equation}}

\psset{linewidth=.5pt,dash=2.5pt 2.5pt,unit=.25in,arrowsize=4pt 3}
\SpecialCoor

\newgray{gray90}{.90}
\newcommand{\ar}{\pspicture(0,0)(0,0)
    \psline[arrows=->](4.3pt,0)(4.4pt,0)\endpspicture}
\newcommand{\sgpie}{
    \pscustom[linestyle=none,fillstyle=solid,fillcolor=gray90]{
    \psarcn(4.899;30){1.464}{255}{165} \psarcn(4.899;60){1.464}{285}{195}
    \psarcn(4.899;90){1.464}{315}{225} \psarcn(4.899;120){1.464}{345}{255}
    \psarcn(4.899;150){1.464}{15}{285} \psarcn(4.899;210){1.464}{75}{345}
    \psarcn(4.899;240){1.464}{105}{15} \psarcn(4.899;270){1.464}{135}{45}
    \psarcn(4.899;300){1.464}{165}{75} \psarcn(4.899;330){1.464}{195}{105}}
    \psarcn(4.899;30){1.464}{255}{165} \psarcn(4.899;60){1.464}{285}{195}
    \psarcn(4.899;90){1.464}{315}{225} \psarcn(4.899;120){1.464}{345}{255}
    \psarcn(4.899;150){1.464}{15}{285} \psarcn(4.899;210){1.464}{75}{345}
    \psarcn(4.899;240){1.464}{105}{15} \psarcn(4.899;270){1.464}{135}{45}
    \psarcn(4.899;300){1.464}{165}{75} \psarcn(4.899;330){1.464}{195}{105}
    \qdisk(4;165){.1} \qdisk(4;195){.1} \qdisk(4;225){.1} \qdisk(4;255){.1}
    \qdisk(4;285){.1} \qdisk(4;315){.1} \qdisk(4;345){.1} \qdisk(4;15){.1}
    \qdisk(4;45){.1} \qdisk(4;75){.1} \qdisk(4;105){.1} \qdisk(4;135){.1}
    \rput{120}(3.435;30){\ar} \rput{150}(3.435;60){\ar}
    \rput{180}(3.435;90){\ar} \rput{210}(3.435;120){\ar}
    \rput{240}(3.435;150){\ar} \rput{300}(3.435;210){\ar}
    \rput{330}(3.435;240){\ar} \rput{0}(3.435;270){\ar}
    \rput{30}(3.435;300){\ar} \rput{60}(3.435;330){\ar}
    \uput[180](4;180){\large $\vdots$}
    \uput[0](4;0){\large $\vdots$}}

\begin{document}
\title{Fat 4-polytopes and fatter 3-spheres}

\author{David Eppstein}
\email[Email: ]{eppstein@ics.uci.edu}
\thanks{Supported in part by NSF grant CCR \#9912338}
\affiliation{Department of Information and Computer Science,
    University of California, Irvine, CA 92697}
\author{Greg Kuperberg}
\email[Email: ]{greg@math.ucdavis.edu}
\thanks{Supported by NSF grant DMS \#0072342}
\affiliation{Department of Mathematics,
    University of California, Davis, CA 95616}
\author{G\"unter M. Ziegler}
\email[Email: ]{ziegler@math.tu-berlin.de}
\thanks{Supported by a DFG Leibniz grant}
\affiliation{Institut f\"ur Mathematik, MA 6-2,
    Technische Universit\"at Berlin, D-10623 Berlin, Germany}

\begin{abstract}
We introduce the \emph{fatness} parameter of a $4$-dimensional polytope $P$,
defined as $\phi(P)=(f_1+f_2)/(f_0+f_3)$.  It arises in an important open
problem in $4$-dimensional combinatorial geometry: Is the fatness of convex
$4$-polytopes bounded?

We describe and analyze a hyperbolic geometry construction that produces
$4$-polytopes with fatness $\phi(P)>\maxfatness$, as well as the first infinite
family of $2$-simple, $2$-simplicial $4$-polytopes. Moreover, using a
construction via finite covering spaces of surfaces, we show that fatness is
not bounded for the more general class of strongly regular CW decompositions of
the $3$-sphere.
\end{abstract}

\maketitle

\section{Introduction}
\label{s:intro}

The characterization of the set ${\cal F}_3$ of $f$-vectors of convex 3-dimensional
polytopes (from 1906, due to Steinitz \cite{Steinitz:eulerschen}) is well-known
and explicit, with a simple proof: An integer vector $(f_0,f_1,f_2)$ is the
$f$-vector of a $3$-polytope if and only if it satisfies
\begin{itemize}\setlength{\itemsep}{0pt}
\item $f_1=f_0+f_2-2$ (the Euler equation),
\item $f_2\le 2f_0-4$ (with equality for simplicial polytopes), and
\item $f_0\le 2f_2-4$ (with equality for simple polytopes).
\end{itemize}
(Recall that by the definition of the $f$-vector, $f_k$ is the number
of $k$-faces of the polytope.)
This simple result is interesting for several reasons:
\begin{itemize}\setlength{\itemsep}{0pt}
\item The set of $f$-vectors is the set of \emph{all} the integer points in a
closed $2$-dimensional \emph{polyhedral cone} (whose apex is the $f$-vector
$f(\Delta_3)=(4,6,4)$ of a $3$-dimensional simplex). In particular, it is
\emph{convex} in the sense that ${\cal F}_3=\conv({\cal F}_3)\cap \Z^3$.
\item The same characterization holds for convex $3$-polytopes (geometric
objects), more generally for strongly regular CW $2$-spheres (topological
objects), and yet more generally for Eulerian lattices of length $4$
(combinatorial objects \cite{Stanley:eulerian}).
\end{itemize}

In contrast to this explicit and complete description of ${\cal F}_3$, our
knowledge of the set ${\cal F}_4$ of $f$-vectors of (convex) $4$-polytopes (see
Bayer \cite{Bayer:extended} and H\"oppner and Ziegler \cite{HZ:census}) is very
incomplete. We know that the set ${\cal F}_4$ of all $f$-vectors of
4-dimensional polytopes has no similarly simple description. In particular, the
convex hull of ${\cal F}_4$ is not a cone, it is not a closed set, and not all
integer points in the convex hull are $f$-vectors. Also, the $3$-dimensional
cone with apex $f(\Delta_4)$ spanned by ${\cal F}_4$ is not closed, and its
closure may not be polyhedral.

Only the two extreme cases of simplicial and of simple $4$-polytopes (or
$3$-spheres) are well-understood.   Their $f$-vectors correspond to faces of
the convex hull of ${\cal F}_4$, defined by the valid inequalities $f_2\ge
2f_3$ and $f_1\ge 2f_0$, and the $g$-Theorem, proved for $4$-polytopes by
Barnette \cite{Barnette:inequalities} and for $3$-spheres by Walkup
\cite{Walkup:lower}, provides \emph{complete} characterizations of their
$f$-vectors. (The $g$-Theorem for general simplicial polytopes was famously
conjectured by McMullen \cite{McMullen:simplicial} and proved by Billera and
Lee \cite{BL:sufficiency} and Stanley \cite{Stanley:simplicial}.  See
\cite[\S8.6]{Ziegler:gtm} for a review.)

But we have no similarly complete picture of other extremal types of
$4$-polytopes. In particular, we cannot currently answer the following key
question: Is there a constant $c$ such that all  $4$-dimensional convex
polytopes $P$ satisfy the inequality
\[
f_1(P)+f_2(P)\;\le\;c\,(f_0(P)+f_3(P))?
\]
To study this question, we introduce the \emph{fatness} parameter
\[
\phi(P)\;\eqdef\;\frac{f_1(P)+f_2(P)}{f_0(P)+f_3(P)}
\]
of a $4$-polytope $P$.  We would like to know whether fatness is bounded.

For example, the $4$-simplex has fatness $2$, while the $4$-cube and the
$4$-cross polytope have fatness $\frac{56}{24}=\frac73$. More generally, if $P$
is simple, then we can substitute the Dehn-Sommerville relations
\[
f_2(P)=f_1(P)+f_3(P)-f_0(P)\qquad f_1(P)=2f_0(P)
\]
into the formula for fatness, yielding
\[
\phi(P)=\frac{f_1(P)+f_2(P)}{f_0(P)+f_3(P)}
    = \frac{3f_0(P)+f_3(P)}{f_0(P)+f_3(P)}<3.
\]

Since every $4$-polytope and its dual have the same fatness, the same upper
bound holds for simplicial $4$-polytopes. On the other hand, the ``neighborly
cubical'' $4$-polytopes of Joswig and Ziegler \cite{JZ:cubical} have
$f$-vectors
\[
(4,2n,3n-6,n-2)\cdot 2^{n-2},
\]
and thus fatness
\[
\phi=\frac{5n-6}{n+2} \to 5.
\]
In particular, the construction of these polytopes disproved the conjectured
flag-vector inequalities of Bayer \cite[pp.~145, 149]{Bayer:extended} and
Billera and Ehrenborg \cite[p.~109]{HZ:census}.

The main results of this paper are two lower bounds on fatness:

\begin{theorem} There are convex $4$-polytopes $P$ with fatness
$\phi(P)>\maxfatness$. \label{th:fat} \end{theorem}

\begin{theorem} The fatness of cellulated $3$-spheres is not bounded.
A $3$-sphere $S$ with $N$ vertices may have fatness as high as
$\phi(S) = \Omega(N^{1/12})$.
\label{th:fatter} \end{theorem}

We will prove \thm{th:fat} in \sec{s:poly} and \thm{th:fatter} in
\sec{s:spheres}, and present a number of related results along the
way.

\section{Conventions}
\label{s:conven}

Let $X$ be a finite
CW complex. If $X$ is identified with a manifold $M$, it is also called a
\emph{cellulation} of $M$. The complex $X$ is \emph{regular} if all closed
cells are embedded \cite[\S38]{Munkres:algtop}.
If $X$ is regular, we define it to
be \emph{strongly regular} if in addition the intersection of any
two closed cells
is a cell.  For example, every simplicial complex is a strongly regular CW
complex.  The complex $X$ is \emph{perfect} if the boundary maps of its chain
complex vanish.  (A non-zero-dimensional perfect complex is never regular.)

The \emph{$f$-vector} of a cellulation $X$, denoted $f(X)=(f_0,f_1,\ldots)$,
counts the number of cells in each dimension:  $f_0(X)$ is the number of
vertices, $f_1(X)$ is the number of edges, etc.

If $X$ is $2$-dimensional, we define its fatness as
\[
\phi(X) \eqdef \frac{f_1(X)}{f_0(X) + f_2(X)}.
\]
If $X$ is $3$-dimensional, we define its fatness $X$ as
\[
\phi(X) \eqdef \frac{f_1(X) + f_2(X)}{f_0(X) + f_3(X)}.
\]
If $P$ is a convex $d$-polytope, then its $f$-vector $f(P)$ is defined to be
the $f$-vector of its boundary complex, which is a strongly regular
$(d-1)$-sphere. If $d=4$ we can thus consider $\phi(P)$, the fatness of $P$.
The faces of $P$ of dimension 0 and 1 are called \emph{vertices} and
\emph{edges} while the faces of dimension $d-1$ and $d-2$ are called
\emph{facets} and \emph{ridges}. We extend this terminology to general
cellulations of $(d-1)$-manifolds.

The \emph{flag vector} of a regular cellulation $X$, and likewise the flag
vector of a polytope $P$, counts the number of nested sequences of cells with
prespecified dimensions.  For example, $f_{013}(X)$ is the number triples
consisting of a $3$-cell of $X$, an edge of the $3$-cell, and a vertex of the
edge; if $P$ is a 4-cube, then
$$f_{013}(P) = 192.$$

A convex polytope $P$ is \emph{simplicial} if each facet of $P$ is a simplex.
It is \emph{simple} if its polar dual $P\pol$
is simplicial, or equivalently if the cone of each vertex matches
that of a simplex.


\section{4-Polytopes}
\label{s:poly}

In this section we construct families of $4$-polytopes with several
interesting properties:

\begin{itemize}\setlength{\itemsep}{0pt}
\item They are the first known infinite families of {\em $2$-simple,
$2$-simplicial $4$-polytopes}, that is, polytopes in which all $2$-faces and
all dual $2$-faces are triangles (all edges are ``co-simple''). \Eg, Bayer
\cite{Bayer:extended} says that it would be interesting to have an infinite
family.

As far as we know, there were only six such polytopes previously known: the
simplex, the hypersimplex (the set of points in $[0,1]^4$ with coordinate sum
between $1$ and $2$), the dual of the hypersimplex, the $24$-cell, and a gluing
of two hypersimplices (due to Braden \cite{Braden:glued}), and the dual of the
gluing. (There are claims in Gr\"unbaum
\cite[p.~82, resp. p.~170]{Grunbaum:convex} that results of Shephard, resp.\
Perles and Shephard, imply the existence of infinitely many $2$-simple
$2$-simplicial $4$-polytopes.  Both claims appear to be incorrect.)

\item They are the fattest known convex $4$-polytopes.

\item They yield finite packings of (not necessarily congruent) spheres in
$\R^3$ with slightly higher average kissing numbers than previously known
examples \cite{Kuperberg:kissing}.
\end{itemize}

Let $Q\subset\R^4$ be a $4$-polytope that contains the origin in its interior.
If an edge $e$ of $Q$ is tangent to the unit sphere $S^3\subset\R^4$ at a point
$t$, then the corresponding ridge ($2$-dimensional face) $F=e\ppol$ of the
polar dual $P=Q\pol$ is also tangent to $S^3$ at $t$.  (Recall that the
polar dual is defined as
$$Q\pol \eqdef \{p | p \cdot q \le 1 \forall q \in Q\}.)$$
Furthermore, the affine
hulls of $e$ and $F$ form orthogonal complements in the tangent space of $S^3$,
so the convex hull $\conv(e\cup F)$ is an orthogonal bipyramid tangent to $S^3$
(\cf, Schulte \cite[Thm.~1]{Schulte:steinitz}).

We will construct polytopes $E$ by what we call the \emph{$E$-construction}.
This means that they are convex hulls
$$E\eqdef\conv(Q\cup P),$$
where $Q$ is a simplicial $4$-dimensional polytope whose edges are tangent to
the unit $3$-sphere $S^3$, and $P$ is the polar dual of $Q$.  Thus $P$ is
simple and its ridges are tangent to $S^3$. (We call $Q$ \emph{edge-tangent}
and $P$ \emph{ridge-tangent}.)

\begin{proposition}
If $P$ is a simple, ridge-tangent $4$-polytope, then the $4$-polytope
$E=\conv(P\cup Q)$ produced by the $E$-construction is $2$-simple and
$2$-simplicial, with $f$-vector
\[
 f(E) = (f_2(P), 6f_0(P), 6f_0(P), f_2(P)),
\]
and fatness
\[
 \phi(E) = 6\,\frac{f_0(P)}{f_2(P)}.
\]
\label{p:e-construction} \end{proposition}

\begin{proof}
Another way to view the $E$-construction is that $E$ is produced from $P$ by
adding the vertices of $Q$ sequentially. At each step, we cap a facet of $P$
with a pyramid whose apex is a vertex of $Q$. Thus the new facets consist of
pyramids over the ridges of $P$, where two pyramids with the same base
(appearing in different steps) lie in the same hyperplane (tangent to $S^3$),
and together form a bipyramid.  The facets of the final polytope $E$ are
orthogonal bipyramids over the ridges of $P$ and are tangent to $S^3$.  Since
the 2-faces of $E$ are pyramids over the edges of $P$, $E$ is $2$-simplicial.

The polytope $E$ is $2$-simple if and only if each edge is \emph{co-simple},
\ie, contained in exactly three facets of $E$.  The iterative construction of
$E$ shows that it has two types of edges: (i) edges of $P$, which are co-simple
in $E$ if and only if they are co-simple in $P$, and (ii) edges formed by
adding pyramids, which are co-simple if and only if the facets of $P$ are
simple.  Since $P$ is simple, its facets are simple and its edges are
co-simple, so $E$ is then $2$-simple.

This combinatorial description of $E$ yields an expression for the $f$-vector
of $E$ in terms of the flag vector
\cite{BJ:dehn,Bayer:extended,HZ:census} of $P$.  Since the facets
of $E$ are bipyramids over the ridges of $P$, the following identities hold:
\begin{align*}
f_3(E) &= f_2(P) & f_2(E) &= f_{13}(P) \\
f_1(E) &= f_1(P)+f_{03}(P) & f_0(E) &= f_0(P)+f_3(P).
\end{align*}
Since $P$ is simple,
\[
f_{03}(P)=4f_0(P) \qquad f_{13}(P)=3f_1(P).
\]
These identities together with Euler's equation and $f_1(P)=2f_0(P)$ imply the
proposition.
\end{proof}

The $f$-vector of $P$ also satisfies
\[
f_0(P)-f_1(P)+f_2(P)-f_3(P)=0 \qquad f_1(P)=2f_0(P),
\]
in the second case because $P$ is simple, so the fatness of $E$ can also be
written
\[
\phi(E) = 6\,\Big(1-\frac{f_3(P)}{f_2(P)}\Big) =
6\,\Big(1-\frac{f_0(Q)}{f_1(Q)}\Big).
\]
Thus maximizing the fatness of $E$ is equivalent to maximizing the ridge-facet
ratio $f_2(P)/f_3(P)$, or the average degree of the graph of $Q$.  It also
shows that the $E$-construction cannot achieve a fatness of $6$ or more.

In light of \prop{p:e-construction}, we would like to construct edge-tangent
simplicial $4$-polytopes. Regular simplicial $4$-polytopes (suitably scaled)
provide three obvious examples: the $4$-simplex $\Delta_4$, the cross polytope
$C_4\pol$, and the $600$-cell.  From these, the $E$-construction produces the
dual of the hypersimplex, the 24-cell, and a new $2$-simple, $2$-simplicial
polytope with $f$-vector $(720,3600,3600,720)$ and fatness $5$,
whose facets are bipyramids over pentagons.

We will construct new edge-tangent simplicial $4$-polytopes by gluing together
(not necessarily simplicial) edge-tangent $4$-polytopes, called \emph{atoms},
to form \emph{compounds}.  We must position the polytopes so that their
facets match, they remain edge-tangent, and the resulting compound is convex.
It will be very useful to interpret the interior of the $4$-dimensional unit
ball as the Klein model of hyperbolic $4$-space $\HH^4$, with $S^3$ the sphere
at infinity.  (See Iversen \cite{Iverson:hyperbolic} and Thurston
\cite[Chap.~2]{Thurston:geometry} for introductions to hyperbolic geometry.) In
particular, Euclidean lines are straight in the Klein model, Euclidean
subspaces are flat, and hence any intersection of a convex polytope with
$\HH^4$ is a convex (hyperbolic) polyhedron.  Even though the Klein model
respects convexity, it does not respect angles. However, angles and convexity
are preserved under hyperbolic isometries.  There are enough isometries to
favorably position certain $4$-polytopes to produce convex compounds.

If a polytope $Q$ is edge-tangent to $S^3$, then it is hyperbolically
hyperideal:  Not only its vertices, but also its edges, lie beyond the sphere
at infinity, except for the tangency point of each edge.  Nonetheless portions
of its facets and ridges lie in the finite hyperbolic realm.  As a hyperbolic
object the polytope $Q$ (more precisely, $Q\cap \HH^4$) is convex and has flat
facets. The ridge $r$ between any two adjacent facets has a well-defined
hyperbolic dihedral angle, which is strictly between $0$ and $\pi$ if (as in
our situation) the ridge properly intersects $\HH^4$.  To compute this angle we
can intersect $r$ at any point $t$ with any hyperplane $R$ that contains the
(hyperbolic) orthogonal complement to $r$ at $t$.  We let $t$ be the tangent
point of any edge $e$ of the ridge, and let $R$ be the hyperplane perpendicular
to $e$.

\begin{fullfigure}{f:hyplink}{A cone emanating from an ideal point $t$ in
    $\HH^3$ in the Poincar\'e model, and a horosphere $S$ incident to $t$.  The
    link of $t$ (here a right isosceles triangle) inherits Euclidean geometry
    from $S$}
\begin{large} \pspicture(-5.5,-5.2)(5.2,6.5)
\pscircle(0,0){5}
\pscurve[linestyle=dashed](2.5,2.165)(1.294,2.415)(0,2.5)(-1.294,2.415)
    (-2.5,2.165)(-3.536,1.768)(-4.33,1.25)(-4.83,0.647)(-5,0)
\pscurve[linestyle=dashed](2.5,2.165)(3.536,1.768)(4.33,1.25)(4.83,0.647)(5,0)
\pscurve(-5,0)(-4.83,-0.647)(-4.33,-1.25)(-3.536,-1.768)(-2.5,-2.165)
    (-1.294,-2.415)(0,-2.5)(1.294,-2.415)(2.5,-2.165)(3.536,-1.768)(4.33,-1.25)
    (4.83,-0.647)(5,0)
\pscircle(1.5,1.299){2}
\pscurve[linestyle=dashed](2.5,2.165)(2.018,2.265)(1.5,2.299)(0.982,2.265)
    (0.5,2.165)(0.086,2.006)(-0.232,1.799)(-0.432,1.558)(-0.5,1.299)
\pscurve[linestyle=dashed](2.5,2.165)(3.032,1.942)(3.379,1.641)(3.5,1.299)
\pscurve(-0.5,1.299)(-0.379,0.957)(-0.032,0.656)(0.5,0.433)(1.153,0.314)
    (1.847,0.314)(2.5,0.433)(3.032,0.656)(3.379,0.957)(3.5,1.299)
\pscurve[linestyle=dashed](2.5,2.165)(2.121,1.887)(1.751,1.715)(1.398,1.654)
    (1.07,1.705)(0.776,1.866)
\pscurve(0,4.33)(0.033,3.66)(0.13,3.064)(0.289,2.559)(0.507,2.156)(0.776,1.866)
\pscurve[linestyle=dashed](2.5,2.165)(2.171,1.822)(1.95,1.459)(1.841,1.082)
    (1.848,0.702)(1.97,0.327)
\pscurve(4.33,-1.25)(3.665,-1.02)(3.082,-0.74)(2.597,-0.416)(2.224,-0.057)
    (1.97,0.327)
\psline[linestyle=dashed](2.5,2.165)(0.5,0.433)
\psline(0.5,0.433)(-2.5,-2.165)
\pscurve(-2.5,-2.165)(-2.415,-0.971)(-2.165,0.29)(-1.768,1.531)(-1.25,2.667)
    (-0.647,3.622)(-0,4.33)
\pscurve(4.33,-1.25)(4.183,-0.087)(3.75,1.083)(3.062,2.178)(2.165,3.125)
    (1.121,3.859)(0,4.33)
\pscurve[linewidth=1.5pt](0.5,0.433)(0.512,0.706)(0.546,0.992)(0.602,1.285)
    (0.68,1.579)(0.776,1.866)
\pscurve[linewidth=1.5pt](0.5,0.433)(0.774,0.367)(1.065,0.323)(1.366,0.301)
    (1.67,0.303)(1.97,0.327)
\pscurve[linewidth=1.5pt](0.776,1.866)(0.973,1.581)(1.22,1.244)(1.491,0.894)
    (1.751,0.578)(1.97,0.327)
\qdisk(4.33,-1.25){1.8pt}
\qdisk(-2.5,-2.165){1.8pt}
\qdisk(2.5,2.165){1.8pt}
\qdisk(0,4.33){1.8pt}
\pspolygon[linewidth=1.5pt](-5.3,5)(-5.3,6.3)(-4,5)
\pcline[nodesepA=1.3,nodesepB=1,arrows=->](-4.867,5.433)(1.082,0.875)
\uput[-75](2.5,2.165){$t$}
\rput(1.5,-0.26){$S$}
\rput(-3.348,0.1){$\HH^3$}
\endpspicture
\end{large} \eatline \end{fullfigure}

Within the hyperbolic geometry of $R \cong \HH^3$, every line emanating from
the ideal point $t$ is orthogonal to any horosphere incident to $t$. Thus the
link of the edge $e$ of $Q$ is the intersection of $Q\cap R$ with a
sufficiently small horosphere $S$ at $t$.  Since horospheres have flat
Euclidean geometry \cite[p.~61]{Thurston:geometry}, the link $Q \cap S$ is a
Euclidean polygon.  Its edges correspond to the facets of $Q$ that contain $e$,
and its vertices correspond to the ridges of $Q$ that contain $e$. Thus the
dihedral angle of a ridge $r$ of $Q$ equals to the Euclidean angle of the
vertex $r \cap S$ of the Euclidean polygon $Q \cap S$. This is easier to see in
the Poincar\'e model of hyperbolic space, because it respects angles, than in
the Klein model. \fig{f:hyplink} shows an example.

To summarize:

\begin{lemma}
A compound of two or more polytopes is convex if and only if each ridge has
hyperbolic dihedral angle less than $\pi$, or equivalently, iff each edge
link is a convex Euclidean polygon.
\label{l:convex} \end{lemma}

Compounds can also have interior ridges with total dihedral
angle exactly $2\pi$.  But since all atoms of a compound are
edge-tangent, compounds do not have any interior edges or vertices.

If $Q$ is a regular polytope, then $Q \cap S$ is a regular polygon.
The following lemma is then immediate:

\begin{lemma}
If $Q$ is a regular, edge-tangent, simplicial $4$-polytope,
then in the hyperbolic metric of the Klein model, its dihedral angles
are $\pi/3$ (for the simplex), $\pi/2$ (for the cross polytope), and
$3\pi/5$ (for the $600$-cell).
\label{l:regang} \end{lemma}

A hyperideal hyperbolic object, even if it is an edge-tangent convex
polytope, can be unfavorably positioned so that it is unbounded as a Euclidean
object (\cf, Schulte \cite[p.~508]{Schulte:steinitz}).  Fortunately
there is always a bounded position as well:

\begin{lemma} Let be $Q$ an edge-tangent, convex polytope in $\R^d$ whose
points of tangency with $S^{d-1}$ do not lie in a hyperplane. Then there is a
hyperbolic isometry $h$ (extended to all of $\R^d$) such that $h(Q)$ is
bounded.
\label{l:bounded} \end{lemma}
\begin{proof} Let $p$ lie in the interior of the convex hull of the edge
tangencies and let $f$ be any hyperbolic motion that moves $p$ to the Euclidean
origin in $\R^d$.  Since the convex hull $K$ of the edge tangencies of $h(Q)$
contains the origin, $K\pol$ is a bounded polytope that circumscribes
$S^{d-1}$. Since $K\pol$ is facet-tangent where $h(Q)$ is edge-tangent, $h(Q)
\subset K\pol$.
\end{proof}

In the following we discuss three classes of edge-tangent simplicial convex
$4$-polytopes that are obtained by gluing in the Klein model: Compounds of
simplices, then simplices and cross polytopes, and finally compounds from cut
$600$-cells.  There are yet other edge-tangent compounds involving cross
polytopes cut in half (\ie, pyramids over octahedra), $24$-cells, and
hypersimplices as atoms, but we will not discuss these here.

\subsection{Compounds of simplices}

In this section we classify compounds whose atoms are simplices. This includes
all \emph{stacked} polytopes, which are simplicial polytopes that decompose as
a union of simplices without any interior faces other than facets. However
compounds of simplices are a larger class, since they may have interior ridges.

\begin{lemma}
Any edge-tangent $d$-simplex is hyperbolically regular.
\label{l:hypreg} \end{lemma}

\begin{proof} The proof is by induction on $d$, starting from the case $d=2$, where the
three tangency points define an ideal triangle in $\HH^2$. All ideal triangles
are congruent \cite[p.~83]{Thurston:geometry}.  Since edge-tangent triangles
are the polar duals of ideal triangles, they are all equivalent as well. 

If $d>2$, let $B$ be a general edge-tangent $d$-simplex. On the one hand, there
exists an edge-tangent simplex $A$ which is regular both in hyperbolic geometry
and Euclidean geometry.   On the other hand, given the position of $d$ of the 
vertices, there are at most two choices for the last vertex that  produce an
edge-tangent simplex, one on each side of the hyperplane spanned by the first
$d$. By induction there exists an isometry that takes a face of $B$ to a face
of $A$ and the remaining vertex to the same side.  The edge-tangent constraint
implies that this isometry takes the last vertex of $B$ to the last vertex of
$A$ as well.
\end{proof}

\begin{proposition}\label{p:simplices}
There are only three possible edge-tangent compounds of $4$-simplices:
\begin{itemize}\setlength{\itemsep}{0pt}
\item the regular simplex,
\item the bipyramid (a compound of two simplices that share a facet), and
\item the join of a triangle and a hexagon (a compound of six
  simplices that share a ridge).
\end{itemize}
\end{proposition}

\begin{proof} \fig{f:tjewels} shows all strictly convex polygons with
unit-length edges tiled by unit equilateral triangles, or \emph{triangle
jewels}.  Since the atoms of an edge-tangent compound of simplices are
edge-tangent, they are hyperbolically regular by \lem{l:hypreg}, and their edge
links are equilateral triangles. Thus every edge link of a compound of
simplices is a triangle jewel.  Any three $4$-simplices in a chain in such a
compound share a ridge. In order to create an edge link matching
\fig{f:tjewels}, they must extend to a ring of six simplices around the same
ridge. Adding any further simplex to these six would create an edge link in the
form of a triangle surrounded by three other triangles, which does not appear
in \fig{f:tjewels}.
\end{proof}

\begin{fullfigure}{f:tjewels}{The 3 possible edge links of edge-tangent
    compounds of $4$-simplices}
\psset{unit=.8cm} \pspicture(-2.5,-1)(3.5,1)
\rput(-1.5,0){\pspicture(-.5,-.6)(.5,.6) % triangle
\pspolygon(0,.577)(-.5,-.289)(.5,-.289)
\endpspicture}
\rput(0,0){\pspicture(-.5,-1)(.5,1) % lozenge
\psline(-.5,0)(0,.866)(.5,0)(-.5,0)(0,-.866)(.5,0)
\endpspicture}
\rput(2,0){\pspicture(-1,-1)(1,1) % hexagon
\pspolygon(1;0)(1;60)(1;120)(1;180)(1;240)(1;300)
\psline(1;0)(1;180) \psline(1;60)(1;240) \psline(1;120)(1;300)
\endpspicture}
\endpspicture \eatline \end{fullfigure}

Two of the $E$-polytopes produced by \prop{p:simplices} were previously known.
If $Q$ is the simplex, then $E$ is dual to the hypersimplex.  If $Q$ is the
bipyramid, then $E$ is dual to Braden's glued hypersimplex.  However, if $Q$ is
the six-simplex compound (dual to the product of a triangle and a hexagon),
then $E$ is a new $2$-simple, $2$-simplicial polytope with $f$-vector
$(27,108,108,27)$.

\prop{p:simplices} also implies an interesting impossibility
result.

\begin{corollary}
No stacked $4$-polytope with more than $6$ vertices is edge-tangent.
\end{corollary}

See Schulte~\cite[Thm.~3]{Schulte:steinitz} for the first examples of
polytopes that have no edge-tangent realization.

\subsection{Compounds of simplices and cross polytopes}

Next, we consider compounds of simplices and regular cross polytopes. The edge
link of any convex compound of these two types of polytopes must be one of the
eleven strictly convex polygons tiled by unit triangles and squares, or
\emph{square-triangle jewels} (\fig{f:stjewels}).  See Malkevitch
\cite{Malkevitch:tiling} and Waite \cite{Waite:combining} for work on convex
compounds of these shapes relaxing the requirement of strict convexity.

\begin{fullfigure}{f:stjewels}{The 11 possible edge links of edge-tangent
    compounds of $4$-simplices and cross polytopes}
\psset{unit=.8cm} \pspicture(-.75,.75)(10,8.75)
\rput(0,8){\pspicture(-.5,-.5)(.5,.5) % triangle
\pspolygon(0,.433)(-.5,-.433)(.5,-.433) \endpspicture}
\rput(1.5,8){\pspicture(-.5,-.5)(.5,.5) % square
\psframe(-.5,-.5)(.5,.5) \endpspicture}
\rput(3.25,8){\pspicture(-1,-.5)(1,.5) % lozenge
\psline(0,-.5)(.866,0)(0,.5)(0,-.5)(-.866,0)(0,.5) \endpspicture}
\rput(5.5,8){\pspicture(-.5,-.5)(1.5,.5) % house
\psframe(-.5,-.5)(.5,.5) \psline(.5,.5)(1.366,0)(.5,-.5)
\endpspicture}
\rput(8.25,8){\pspicture(-1.5,-.5)(1.5,.5) % football
\psframe(-.5,-.5)(.5,.5) \psline(.5,.5)(1.366,0)(.5,-.5)
\psline(-.5,.5)(-1.366,0)(-.5,-.5) \endpspicture}
\rput(.75,6.25){\pspicture(-1,-1)(1,1) % hexagon
\pspolygon(1;0)(1;60)(1;120)(1;180)(1;240)(1;300)
\psline(1;0)(1;180) \psline(1;60)(1;240) \psline(1;120)(1;300)
\endpspicture}
\rput(4,6){\pspicture(-1.5,-1)(1.5,1) % six+two
\pspolygon(.5,1)(-.5,1)(-1.366,.5)(-1.366,-.5)(-.5,-1)
    (.5,-1)(1.366,-.5)(1.366,.5)
\psline(-.5,-1)(-.5,1) \psline(.5,-1)(.5,1)
\psline(1.366,.5)(.5,0)(-.5,0)(-1.366,.5)
\psline(1.366,-.5)(.5,0) \psline(-.5,0)(-1.366,-.5)
\endpspicture}
\rput(7.75,5.75){\pspicture(-1.5,-1)(1.5,1) % eight+four
\pspolygon(.5,1.366)(-.5,1.366)(-1.366,.866)(-1.866,0)(-1.366,-.866)
    (-.5,-1.366)(.5,-1.366)(1.366,-.866)(1.866,0)(1.366,.866)
\pspolygon(0,-.5)(.866,0)(0,.5)(-.866,0)
\psline(1.866,0)(.866,0) \psline(-1.866,0)(-.866,0)
\psline(1.366,.866)(.866,0)(1.366,-.866)
\psline(-1.366,.866)(-.866,0)(-1.366,-.866)
\psline(.5,1.366)(0,.5)(-.5,1.366) \psline(.5,-1.366)(0,-.5)(-.5,-1.366)
\psline(0,.5)(0,-.5)
\endpspicture}
\rput(1.5,3){\pspicture(-2,-2)(2,2) % pie
\pspolygon(1.932;15)(1.932;45)(1.932;75)(1.932;105)(1.932;135)(1.932;165)
    (1.932;195)(1.932;225)(1.932;255)(1.932;285)(1.932;315)(1.932;345)
\pspolygon(1;30)(1;90)(1;150)(1;210)(1;270)(1;330)
\psline(1.932;15)(1;30)(1.932;45) \psline(1.932;75)(1;90)(1.932;105)
\psline(1.932;135)(1;150)(1.932;165) \psline(1.932;195)(1;210)(1.932;225)
\psline(1.932;255)(1;270)(1.932;285) \psline(1.932;315)(1;330)(1.932;345)
\psline(1;30)(1;210) \psline(1;90)(1;270) \psline(1;150)(1;330)
\endpspicture}
\rput(5.25,3.5){\pspicture(-2,-2)(2,2) % seven+three
\pspolygon(0,-1.866)(.866,-1.366)(1.366,-.5)(1.366,.5)(.5,1)(-.5,1)
    (-1.366,.5)(-1.366,-.5)(-.866,-1.366)
\pspolygon(0,-.866)(.5,0)(-.5,0)
\psline(1.366,-.5)(.5,0)(.5,1) \psline(-1.366,-.5)(-.5,0)(-.5,1)
\psline(-.866,-1.366)(0,-.866)(.866,-1.366)
\psline(1.366,.5)(.5,0) \psline(-1.366,.5)(-.5,0) \psline(0,-1.866)(0,-.866)
\endpspicture}
\rput(8.5,3){\pspicture(-2,-1.5)(0,2) % three+two
\pspolygon(-0,.5)(-.5,1.366)(-1.366,.866)(-1.866,0)(-1.366,-.866)
    (-.5,-1.366)(-0,-.5)
\psline(-.866,0)(-0,.5) \psline(-.866,0)(0,-.5) \psline(-.866,0)(-1.366,.866)
\psline(-.866,0)(-1.866,0) \psline(-.866,0)(-1.366,-.866)
\endpspicture}
\endpspicture \eatline \end{fullfigure}

If $Q$ is a single cross polytope, then $E$ is a 24-cell. We can also glue
simplices onto subsets of the facets of the cross polytope. The new dihedral
angles formed by such a gluing are $5\pi/6$. The resulting compound is convex
as long as no two glued cross polytope facets share a ridge.  We used a
computer program to list the combinatorially distinct ways of choosing a subset
of nonadjacent facets of the cross polytope; the results may be summarized as
follows. In addition to the 24-cell, this yields 20 new $2$-simple,
$2$-simplicial polytopes.

\begin{proposition}
There are exactly $21$ distinct simplicial edge-tangent compounds composed of
one regular $4$-dimensional cross polytope and $k\ge0$ simplices, according to
the following table:
$$\begin{tabular}{r@{\;}|@{\;}ccccccccc@{\;}|@{\;}c}
$k$&0&1&2&3&4&5&6&7&8&Total\\ \hline
\#&1&1&3&3&6&3&2&1&1&21\\
\end{tabular}$$
\label{p:crosspoly} \end{proposition}

We can also confirm that every square-triangle jewel arises as the edge link of
an edge-tangent $4$-dimensional compound.  For every jewel other than the one
in the center, we can form a convex \emph{edge bouquet} consisting of simplices
and cross polytopes that meet at an edge: we replace each triangle by a simplex
and each square by a cross polytope.  Since the central jewel has two adjacent
squares, its edge bouquet is not convex.  Instead we glue two cross polytopes
along a facet so that the 4 ridges of that facet are flush, \ie, their dihedral
angle is $\pi$.  Thus we can ``caulk'' each such ridge with three simplices
that share the ridge.  The central jewel is the link of 6 of the edges of the
resulting compound of 2 cross polytopes and 12 simplices.

Simplices and regular cross polytopes combine to form many other edge-tangent
simplicial polytopes and hence $2$-simple, $2$-simplicial
polytopes. In particular, these methods lead to the following theorem.

\begin{theorem}
There are infinitely many combinatorially distinct $2$-simple, $2$-simplicial
facet-tangent $4$-polytopes.
\label{th:inf} \end{theorem}

\begin{proof} We glue $n$ cross polytopes end-to-end. Each adjacent pair
produces 4 flush ridges that we caulk with chains of three simplices.  The
facets to which these simplices are glued are not adjacent and so do not
produce any further concavities.
\end{proof}

The chain of $n$ cross polytopes has $f$-vector
\[
(4n+4,18n+6,28n+4,14n+2).
\]
Filling a concavity adds $(2,9,14,7)$, so after filling the $4(n-1)$
concavities we get a simplicial polytope $Q$ with
\[
f(Q)\;=\;(12n- 4,54n-30,84n-54,42-26),
\]
which yields a $2$-simple, $2$-simplicial $4$-polytope $E$
with
\[
f(E)\;=\;(54n-30,252n-156,252n-156,54n-30)
\]
by \prop{p:e-construction}.

\begin{remark} Every $2$-simple, $2$-simplicial $4$-polytopes that we know is
combinatorially equivalent to one which circumscribes the sphere.  Are there
any that are not?

We do know a few $2$-simple, $2$-simplicial $4$-polytopes which are not
$E$-polytopes.  Trivially there is the simplex. There are a few others that
arise by the fact that the $24$-cell is the $E$-polytope of a cross polytope
in 3 different ways.  Color the vertices of a $24$-cell red, green, and blue,
so that the vertices of each color span a cross polytope. If we cap one facet
of a cross-polytope by a simplex and apply the $E$-construction, the result is
a $24$-cell in which 6 facets that meet at 1 vertex are replaced by 10 facets
and 4 vertices.  If the replaced vertex is red, the replacement can be induced
by capping either blue cross polytope or the green cross polytope and then
applying the $E$-construction; the position of the replacement differs between
the two cases. If we replace two different red vertices, one by capping the
green cross polytope and the other by capping the blue cross polytope, then
the resulting polytope is $2$-simple and $2$-simplicial but not an
$E$-polytope.  This construction has several variations: for example, we can
also replace three vertices, one of each color.
\end{remark}

\subsection{Compounds involving the $600$-cell}
\label{s:600}

If $Q$ is the $600$-cell, then $E$ is a $2$-simple, $2$-simplicial polytope
with $f$-vector $(720,3600,3600,720)$ and fatness exactly $5$.  Again, we can
glue simplices onto any subset of nonadjacent facets of the $600$-cell,
creating convex compounds with dihedral angle $14\pi/15$. We did not count the
(large) number of distinct ways of choosing such a subset, analogous to
\prop{p:crosspoly}. It is not possible to glue a cross polytope to a
$600$-cell, because that would create an $11\pi/10$ angle (\ie, a concave
dihedral of $9\pi/10$) which cannot be filled by additional simplices or cross
polytopes.

The large dihedral angles of the $600$-cell make it difficult to form
compounds from it, but we can modify it as follows to create smaller dihedrals.
Remove a vertex and form the convex hull of the remaining 119 vertices.
The resulting convex polytope has 580 of the $600$-cell's tetrahedral facets
and one icosahedral facet. The pentagonal edge link (\fig{f:cutpents}(a)) of
the edges bordering this new facet become modified in a similar way, by
removing one vertex and forming the convex hull of the remaining four vertices
(\fig{f:cutpents}(b)), which results in a trapezoid; thus, the hyperbolic
dihedrals at the ridges around the new facet are $2\pi/5$.

\begin{fullfigure}{f:cutpents}{Edge figures of (a) a $600$-cell, (b) a
    $600$-cell with one vertex removed, (c) a $600$-cell with two removed
    vertices, and (d) an icosahedral cap}
\pspicture(0,-1)(9,10)
\rput(2,8){\pspicture(-2,-2)(2,2)
\pspolygon(2;90)(2;162)(2;234)(2;306)(2;18)
\uput[270](2;90){$\frac{3\pi}{5}$} \psarc(2;90){1.1}{216}{324}
\endpspicture} \rput(2,5.5){\large (a)}
\rput(7,8){\pspicture(-2,-2)(1.25,2)
\pspolygon(2;90)(2;162)(2;234)(2;306)
\uput{.4}[253](2;90){$\frac{2\pi}{5}$} \psarc(2;90){1.25}{216}{288}
\endpspicture} \rput(7,5.5){\large (b)}
\rput(2,2){\pspicture(-1.25,-2)(1.25,2)
\pspolygon(2;90)(2;234)(2;306)
\uput{.65}[270](2;90){$\frac{\pi}{5}$} \psarc(2;90){1.5}{252}{288}
\endpspicture} \rput(2,-.5){\large (c)}
\rput(7,2){\pspicture(-2,-2)(.25,2)
\pspolygon(2;90)(2;162)(2;234)
\uput{.65}[234](2;90){$\frac{\pi}{5}$} \psarc(2;90){1.5}{216}{252}
\endpspicture} \rput(7,-.5){\large (d)}
\endpspicture \eatline \end{fullfigure}

This cut polytope is not simplicial, but we may glue two of these polytopes
together along their icosahedral facets, forming a simplicial polytope with
$4\pi/5$ dihedrals along the glued ridges.  This compound's new edge links are
hexagons formed by gluing pairs of trapezoids (\fig{f:link600}(a)).  The
same cutting and gluing process may be repeated to form a sequence or tree of
$600$-cells, connected along cuts that do not share a ridge.  For such a chain
or tree formed from $n$ cut $600$-cells, the $f$-vector may be computed as
\[
f(Q)\;=\;(106n+14,666n+54,1120n+80,560n+40),
\]
so the $E$-construction yields
\[
f(E)\;=\;(666n+54,3360n+240,3360n+240,666n+54)
\]
and thus a fatness of
\[
\phi(E)\;=\;\frac{3360n+240}{666n+54}\ \
\longrightarrow\ \ \frac{560}{111}\ \approx\ 5.045045.
\]
Thus the fatness of the $2$-simple, $2$-simplicial polytopes formed by such
compounds improves slightly on that formed from the $600$-cell alone.

\begin{fullfigure}{f:link600}{Edge links of compounds of cut $600$-cells}
\pspicture(0,-5)(13.5,4)
\rput(2.5,0){\pspicture(-2,-2.5)(2,2.5)
\pspolygon(1.176,2.236)(-1.176,2.236)(-1.902,0)
    (-1.176,-2.236)(1.176,-2.236)(1.902,0)
\psline(-1.902,0)(1.902,0)
\endpspicture}
\rput(2.5,-4.5){\large (a)}
\rput(9.5,0){\pspicture(-4,-4)(4,4)
\pspolygon(3.804;0)(3.804;36)(3.804;72)(3.804;108)(3.804;144)
    (3.804;180)(3.804;216)(3.804;252)(3.804;288)(3.804;324)
\psline(3.804;0)(3.804;180) \psline(3.804;36)(3.804;216)
\psline(3.804;72)(3.804;252) \psline(3.804;108)(3.804;288)
\psline(3.804;144)(3.804;324)
\endpspicture}
\rput(9.5,-4.5){\large (b)}
\endpspicture
\end{fullfigure}

It is also possible to form compounds involving $600$-cells which have been cut
by removing several vertices (as described above) so that two of the resulting
icosahedral facets meet at a ridge. Each edge link at this ridge is an
isosceles triangle formed by removing two vertices from a pentagon
(\fig{f:cutpents}(c)). Thus the dihedral angle of the triangular ridge between
the icosahedral facets is $\pi/5$. We can therefore form compounds in which ten
of these doubly-cut $600$-cells share a triangle, whose edges links are a
regular decagon cut into ten isosceles triangles (\fig{f:link600}(b)).
Yet other compounds of cut $600$-cells and simplices are possible,
although we do not need them here.

The cut $600$-cells also form more complicated compounds which require some
group-theoretic terminology to explain.  The vertices of a regular $600$-cell
form a 120-element group under (rescaled) quaternionic multiplication, the
binary icosahedral group.  This group has a 24-element subgroup, the binary
tetrahedral group, which also arises as the units of the Hurwitz integers (see
Conway and Sloane \cite[\S2.2.6,8.2.1]{CS:splag}).  Let $A$ be the convex hull
of the other 96 vertices of the $600$-cell;  \ie, $A$ is formed by cutting 24
vertices from $600$-cell in the above manner. The resulting polytope is the
``snub$\{3,4,3\}$'' (snub 24-cell) of Coxeter
\cite[\S8.4,8.5]{Coxeter:regpoly}.  Its $f$-vector is $(96,432,480,144)$.
Every icosahedral facet of $A$ is adjacent to $8$ other icosahedron facets, as
well as to $12$ tetrahedra. Thus $A$ has $96$ icosahedron-icosahedron ridges.

We can build new hyperbolic, edge-tangent, simplicial polytopes by gluing
copies of $A$ along icosahedral faces and capping the remaining icosahedral
facets with pyramidal caps of the type that we had cut off to form $A$. (The
edge links of such a cap $C$ are given by \fig{f:cutpents}(d).) The resulting
polytope $Q$ will be convex if at each icosahedral-icosahedral ridge of a copy
of $A$, either $10$ copies of $A$ meet, or two caps and one or two copies of
$A$ do.  Also at each icosahedral-tetrahedral ridge of a copy of $A$, either
two copies of $A$ or one each of $A$ and a cap must meet. If two copies of $A$
meet (in an icosahedral facet $F$), then they differ by a reflection through
$F$. These reflections generate a discrete hyperbolic reflection group $\Gamma$
since the supporting hyperplanes of the icosahedral facets (the facets of a
hyperideal $24$-cell, whose ridges are also ridges of $A$!) satisfy the Coxeter
condition: When they meet, they meet at an angle of $\pi/5$, which divides
$\pi$. Thus the copies of $A$ used in $Q$ are a finite subset $\Sigma$ of the
orbit of $A$ under $\Gamma$.  The set $\Sigma$ determines $Q$.

\begin{remark} That it suffices to consider the dihedral angles of adjacent
facets follows from Poincar\'e's covering-space argument:  Let $P$ be a
spherical, Euclidean, or hyperbolic polytope whose dihedral angles divide
$\pi$.  Let $X$ denote the space in which it lives.  Let $Y$ be the disjoint
union of all copies of $P$ in $X$ in every position, and let $Z$ be the
quotient of $Y$ given by identifying two copies of $P$ along a shared facet.
The space $Z$ is constructed abstractly so that $P$ tiles it.

We claim that $Z$ is a covering space of $X$.  Each $p \in Z$ lies in the
interior of some face $F$ of a copy of $P$.  If $F$ is a copy of $P$ or a
facet, this is elementary; if $F$ is a ridge, it follows from the dihedral
angle condition.  Otherwise it follows by applying the covering-space argument
inductively, replacing $X$ by the link $S$ of $F$ and $P$ by $P \cap S$.

Since $Z$ is a covering space, a connected component of $Z$ is a tiling of $X$
by $P$. See Vinberg \cite{Vinberg:reflection} for a survey of hyperbolic
reflection groups.
\end{remark}

There is no one best choice for $\Sigma$, only a supremal limit.  One
reasonable choice for $\Sigma$ is the corona of a copy of $A$, \ie, $A$
together with the set of all images under $\Gamma$ that meet it, necessarily at
a facet or a ridge. The corona of $A$ is depicted by a simplified (and
therefore erroneous) schematic in \fig{f:corona}; the reader should imagine the
correct, more complicated version.  The schematic uses a chemistry notation in
which each copy of $A$ is represented as an \emph{atom}, each pair of copies
that shares a facet is represented as a \emph{bond}, and ``$7A$'' denotes a
chain of 7 atoms.  To extend the terminology, we call 10 copies of $A$ that
meet at a ridge a \emph{ring}. The schematic is simplified in that the central
copy actually has 24 bonds (not 6), each of the neighbors has 9 bonds (not 3),
and there are 96 rings (not 6).

\begin{fullfigure}{f:corona}{An oversimplified schematic of a corona of $A$}
\begin{large} \pspicture(-4,-4)(4,4) \psset{nodesep=3pt}
\rput(0,0){\rnode{a}{$A$}}
\rput(2.4;0){\rnode{b1}{$A$}} \rput(2.4;60){\rnode{b2}{$A$}}
\rput(2.4;120){\rnode{b3}{$A$}} \rput(2.4;180){\rnode{b4}{$A$}}
\rput(2.4;240){\rnode{b5}{$A$}} \rput(2.4;300){\rnode{b6}{$A$}}
\rput(3.6;30){\rnode{c1}{$7A$}} \rput(3.6;90){\rnode{c2}{$7A$}}
\rput(3.6;150){\rnode{c3}{$7A$}} \rput(3.6;210){\rnode{c4}{$7A$}}
\rput(3.6;270){\rnode{c5}{$7A$}} \rput(3.6;330){\rnode{c6}{$7A$}}
\ncline{a}{b1} \ncline{a}{b2} \ncline{a}{b3}
\ncline{a}{b4} \ncline{a}{b5} \ncline{a}{b6}
\ncline{b1}{c1} \ncline{b1}{c6} \ncline{b2}{c2} \ncline{b2}{c1}
\ncline{b3}{c3} \ncline{b3}{c2} \ncline{b4}{c4} \ncline{b4}{c3}
\ncline{b5}{c5} \ncline{b5}{c4} \ncline{b6}{c6} \ncline{b6}{c5}
\endpspicture \end{large} \eatline \end{fullfigure}

Let $Q$ be the union of these copies of $A$ with the remaining icosahedral
facets capped.  To compute the $f$-vector of $Q$ it is easier to view each atom
as a copy of a 600-cell $B$, minus two caps for each bond.  There are $1+24+96
\cdot 7 = 697$ atoms and $24+ 96 \cdot 8 = 792$ bonds in total. Thus $Q$ has
\[
f_3(Q) = 697 f_3(B) - 792 \cdot 2 f_3'(C) = 386520
\]
facets, where $f_3'(C)=30$ is the number of simplicial facets of a cap $C$.

Counting vertices is more complicated.  Let $I$ be an icosahedron
and let $T$ be a triangle.  Then
\begin{align*}
f_0(Q) &= 697 f_0(B) - 792 \cdot 2 f_0(C) + 792 f_0(I) + 96 f_0(T) \\
&= 72840,
\end{align*}
because after the vertices of the caps are subtracted, the vertices of each
icosahedral facet at a bond are undercounted once, and after these are restored
the vertices of each triangle at the center of a ring are undercounted once.
The rest of the $f$-vector of $Q$ follows from the Dehn-Sommerville equations:
\begin{align*}
f_2(Q) &= 2f_3(Q) = 773040, \\
f_1(Q) &= f_0(Q) + f_3(Q) = 459360.
\end{align*}
The polytope $Q$ yields an $E$-polytope with fatness
\[
\phi(E) = 6\,\frac{f_3(Q)}{f_1(Q)} = \frac{3221}{638} \approx 5.048589.
\]
Note that since this bound arises from a specific choice of $\Sigma$
rather than a supremal limit, this is not optimal as a lower
bound of supremal fatness.

\subsection{Kissing numbers}
\label{s:kissing}

As mentioned above, another use of ridge-tangent polytopes $P$ is the average
kissing number problem \cite{Kuperberg:kissing}.  Let $X$ be a finite packing
of (not necessarily congruent) spheres $S^3$, which is equivalent to a finite
sphere packing in $\R^3$ by stereographic projection. The question is to
maximize the average number of kissing points of the spheres in $X$.  If $P$ is
ridge-tangent, its facets intersect the unit sphere $S^3$ in a sphere packing
$X$, in which the spheres kiss at the tangency points of $P$. Thus the
ridge-facet ratio of $P$ is exactly half the average kissing number of $X$.
(Not all sphere packings come from ridge-tangent polytopes in this way.)

The sphere packings due to Kuperberg and Schramm \cite{Kuperberg:kissing} can
be viewed as coming from a compound consisting of a chain or tree of $n$ cut
$600$-cells (\ie, atoms in the sense of \fig{f:corona}).  Their average kissing
numbers are
\[
\kappa\; =\; 2\,\frac{666n+54}{106n+14}\ \
\longrightarrow\ \ \frac{666}{53}\ \approx\ 12.56603.
\]
By contrast if $Q$ is the compound formed from a corona of $A$ as in
\sec{s:600}, then the average kissing number of the corresponding sphere
packing is
\[
\kappa(Q) = 2\,\frac{f_1(Q)}{f_0(Q)} = \frac{7656}{607} \approx 12.61285.
\]
Like the bound on fatness, it is not optimal as a lower bound
on the supremal average kissing number.

Here we offer no improvement on the upper bound
\[
\kappa < 8+4\sqrt{3} \approx 14.92820
\]
from \cite{Kuperberg:kissing}, even though it cannot be optimal either.

\section{3-Spheres}
\label{s:spheres}

In this section we construct a family of strongly regular cellulations of the
$3$-sphere with unbounded fatness.  Indeed, we provide an efficient version of
the construction, in the sense that it requires only polynomially many cells to
achieve a given fatness.  (The construction is also a polynomially effective
randomized algorithm.)  Given $N$, we find a strongly regular cellulation of
$S^3$ with $O(N^{12})$ cells and fatness at least $N$.  Note that there are
also power-law upper bounds on fatness:  An $O(N^{1/3})$ upper bound for the
fatness of a convex $4$-polytope with $N$ vertices follows from work by
Edelsbrunner and Sharir \cite{ES:hyperplane}.  The K\H{o}vari-S\'os-Tur\'an
theorem \cite{KST:problem} (see also \cite[p.~1239]{Bollobas:extremal} and
\cite[Thm.~9.6,p.~121]{PA:combin}) implies an $O(N^{2/3})$ upper bound on the
fatness of strongly regular cellulations of $S^3$, since the vertex-facet
(atom-coatom) incidence graph has no $K_{3,3}$-subgraph, and thus has at most
$O\big(f_0(f_0+f_3)^{2/3}\big)$ edges. Our construction provides an
$\Omega(N^{1/12})$ lower bound.

The inefficient construction is a simpler version which we describe first.  For
every $g>0$, $S^3$ can be realized as
\[
H_1 \cup (S_g \times I) \cup H_2,
\]
a thickened surface of genus $g$ capped on both ends with handlebodies. (This
is obtained from a neighborhood of the standard [unknotted] smooth embedding
of $S_g$ into $S^3$.) If for some $g$ we can find a fat cellulation of $S_g$,
we can realize $S^3$ as a ``fat sausage with lean ends,'' as shown in
\fig{f:sausage}.  We cross the fat cellulation of $S_g$ with an interval
divided into $N$ segments to produce a fat cellulation of $S_g \times I$.  Then
we fix arbitrary strongly regular cellulations of the handlebodies $H_1$ and
$H_2$.  If we make the sausage long enough, \ie, if we take $N \to \infty$, the
fatness of the sausage converges to the fatness of its middle regardless of the
structure of its ends.

\begin{fullfigure}{f:sausage}{$S^3$ as a fat sausage with lean ends}
\begin{large} \psset{unit=.2in} \pspicture(-8,-2.5)(8,3)
\multips(-6,0)(4,0){4}{
    \psbezier(.7,-1)(.7,-1.5)(.35,-2)(0,-2)
    \psbezier(.7,-1)(.7,-.5)(.35,-.5)(.35,0)
    \psbezier(.35,0)(.35,.5)(.7,.5)(.7,1)
    \psbezier(.7,1)(.7,1.5)(.35,2)(0,2)
    \psbezier(-.7,-1)(-.7,-1.5)(-.35,-2)(0,-2)
    \psbezier(-.7,-1)(-.7,-.5)(-.35,-.5)(-.35,0)
    \psbezier(-.35,0)(-.35,.5)(-.7,.5)(-.7,1)
    \psbezier(-.7,1)(-.7,1.5)(-.35,2)(0,2)
    \psbezier(0,.65)(.25,.9)(.25,1.15)(0,1.4)
    \psbezier(0,.65)(-.25,.9)(-.25,1.15)(0,1.4)
    \psbezier(0,-.65)(.25,-.9)(.25,-1.15)(0,-1.4)
    \psbezier(0,-.65)(-.25,-.9)(-.25,-1.15)(0,-1.4)}
\psline(-6,2)(6,2)\psline(-6,-2)(6,-2)
\psarc(6,0){2}{270}{90}\psarc(-6,0){2}{90}{270}
\psline[linestyle=dashed](-6,1.4)(6,1.4)
\psline[linestyle=dashed](-6,.65)(6,.65)
\psline[linestyle=dashed](-6,-1.4)(6,-1.4)
\psline[linestyle=dashed](-6,-.65)(6,-.65)
\rput(-7.25,0){$H_1$}\rput(0,0){$S_g \times I$}\rput(7.25,0){$H_2$}
\endpspicture \end{large} \eatline \end{fullfigure}

It remains only to show that there are strongly regular fat cellulations of
surfaces.  The surface $S_g$ has perfect cellulations with $f$-vector
$(1,2g,1)$.  Such a cellulation is obtained by gluing pairs of sides of a
$4g$-gon in such a way that all vertices are identified. It has fatness $g$,
and it exists for arbitrarily large $g$, but it is far from regular. However,
its lift to the universal cover $\tilde{S}_g$ is strongly regular, since any
such cellulation can be represented by a tiling of the hyperbolic plane by
\emph{convex} polygons.  (Indeed, if we take the regular $4g$-gon with angles
of $\pi/(2g)$, which is certainly convex, then its edges and angles are
compatible with any perfect cellulation.)  Moreover, Mal'cev's theorem
\cite{Malcev:faithful}, states that finitely generated matrix groups are
residually finite; this implies that every closed hyperbolic manifold admits
intermediate finite covers with arbitrarily large injectivity radius.  (See
\cite[\S4]{Kuperberg:saturated} for a detailed exposition.) In particular $S_g$
admits an intermediate cover $\hS_g$ whose injectivity radius exceeds the
diameter of a $2$-cell.  The cellulation of $\hS_g$ is then strongly
regular.  Its genus is much larger than $g$, but its fatness is still $g$.

The efficient construction is the same: It only requires careful choices for
the finite cover $\hS_g$ and for the handlebodies $H_1$ and $H_2$. Among
the perfect cellulations of $S_g$, a convenient one for us is a $4g$-gon with
opposite edges identified.  We describe the fundamental group $\pi_1(S_g)$
using this cellulation.  As shown in \fig{f:sg}, we number the edges
$x_0,\dots,x_{4g-1}$ consecutively, so that
\eq{e:ident}{x_i^{} = x_{2g+i}^{-1}}
and
\eq{e:cell}{x_0x_1\cdots x_{4g-1} = 1.}
(We interpret the indices as elements of $\Z/(4g)$.)
Equation~\eqref{e:ident} expresses the identifications, while
equation~\eqref{e:cell} expresses the boundary of the $2$-cell.

\begin{fullfigure}{f:sg}{Labelling edges of $S_g$}
\pspicture(-4.5,-4.5)(4,4.5) \sgpie
\uput[90](3.435;90){$x_0$} \uput[120](3.435;120){$x_1$}
\uput[150](3.435;150){$x_2$} \uput[240](3.435;240){$x_{2g-1}$}
\uput[270](3.435;270){$x_{2g}$} \uput[60](3.435;60){$x_{4g-1}$}
\eatline \endpspicture \end{fullfigure}

We construct $\hS_g$ as a tower of two abelian finite covers, which
together form an irregular cover of $S_g$. (No abelian cover of $S_g$ is
strongly regular.) The surface $S_g$ satisfies the usual requirements of
covering-space
theory (see Fulton \cite[\S\ 13b, 14a]{Fulton:gtm}): It is a connected,
locally path-connected, and locally simply connected space. For any finite
group $A$, the \emph{$A$-coverings} of $S_g$ are covering spaces of the form
$Y$ with $Y/A=S_g$, where $A$ acts properly discontinuously on $Y$. These
coverings, up to isomorphism, are classified by the set of group homomorphisms
$\Hom(\pi_1(S_g,x),A)$ \cite[Thm.~14.a]{Fulton:gtm}. Furthermore, if $A$ is
abelian, then every such homomorphism maps the commutators in $\pi_1(S_g,x)$ to
zero, so the $A$-coverings are classified by $\Hom(H_1(S_g,\Z),A)$. In other
words, if $A$ is any abelian group with $n$ elements, then every homomorphism
$\sigma: H_1(S_g)\rightarrow A$ defines an $n$-fold abelian covering of $S_g$.
(If the homomorphism is not surjective, then the covering space is not
connected \cite[p.~193]{Fulton:gtm}. In this case we use a connected component
of the covering space, which has the same fatness but smaller genus.)

Now assume that $q = 4g+1$ is a prime power and let $\alpha$ generate the
cyclic group $\F_q^*$, where $\F_q$ is the field with $q$ elements.  We can
fulfill the assumption by changing $g$ by a bounded factor.  (Most simply we
can let $q = 5^k$.  Or we can let $q$ be prime, so that $\F_q=\Z/q$, by a form
of Bertrand's postulate for primes in congruence classes.  This result dates to
the 19th century; see Erd\H{o}s \cite{Erdos:primzahlen} for an elementary
proof.) Define a homomorphism $\sigma:H_1(S_g) \to \F_q$ by $\sigma([x_i]) =
\alpha^i$, where $[x_i]$ is the 1-cycle (or homology class) represented by the
loop $x_i$.  Since $\alpha^{2g} = -1$, the definition of $\sigma$ is consistent
with equation~\eqref{e:ident}. Consistency with \eqref{e:cell} is then
automatic. Let $S_g'$ be the finite cover corresponding to $\sigma$.

To prepare for the subsequent analysis of $\hS_g$, we give an explicit
combinatorial description of $S'_g$.  Let $F^0$ be a $2$-cell of $S'_g$
and label its vertices
$$v_0^0,v_1^0,\ldots,v_{4g-1}^0$$
in cyclic order.  See \fig{f:sg1}.

\begin{fullfigure}{f:sg1}{Labelling the vertices of $F^0$}
\pspicture(-5,-4.75)(5,4.75) \sgpie \rput(0,0){\large $F^0$}
\uput[90](3.435;90){$+1$} \uput[120](3.435;120){$+\alpha$}
\uput[150](3.435;150){$+\alpha^2$}
\uput{10pt}[270](3.435;270){$+\alpha^{2g} = -1$}
\uput[300](3.435;300){$+\alpha^{2g} = -\alpha$}
\uput[45](4;45){$v^0_{4g-1}$} \uput[75](4;75){$v^0_0$}
\uput[105](4;105){$v^0_1$}
\eatline \endpspicture \end{fullfigure}

For each $s \in \F_q$, let $F^s$ and $v_k^s$ be the images of $F^0$ and $v_k^0$
under the action of $s$. Since $S_g$ has only one vertex, the vertices of
$S_g'$ may be identified with $\F_q$. Thus, if we identify $v_0^0$ with
$0\in\F_q$, then the action of $\F_q$ will identify $v_0^s$ with $s\in\F_q$.
The structure of $\sigma$ further implies that
\[
v_k^s\ =\ s+1+\alpha+\alpha^2+\ldots+\alpha^{k-1}\ =\
    s+\frac{\alpha^k-1}{\alpha-1}
\]
for all $k\in\Z/(4g)$ and $s\in\F_q$.  See \fig{f:sg2}.

\begin{fullfigure}{f:sg2}{Labelling the vertices of $F^s$}
\pspicture(-7,-4.75)(5.5,4.75) \sgpie \rput(0,0){\large $F^s$}
\uput[75](4;75){$v^s_0 = s$}
\uput[105](4;105){$v^s_1 = s+1$}
\uput[120](4;135){$v^s_2 = s+1+\alpha$}
\uput[135](4;165){$v^s_3 = s+\tfrac{\alpha^3-1}{\alpha-1}$}
\eatline \endpspicture \end{fullfigure}

Using this explicit description, it is routine to verify the following
(remarkable) properties of the surface $S'_g$.

\begin{lemma}
The cellulation of the abelian cover $S'_g$ is regular and has $f$-vector
\[
f(S'_g) = (q,2gq,q)=(q,\binom{q}{2},q).
\]
Every facet has $q-1=4g$ vertices, while every vertex has degree $q-1=4g$. The
graph (or $1$-skeleton) of $S_g'$ is the complete graph on $q+1$ vertices. The
dual graph is also complete; any two facets share exactly one edge (as well as
$q-4$ other vertices).
\label{l:regular} \end{lemma}

\begin{proof}
In view of the combinatorial description above (\fig{f:sg2}), all these
facts follow from simple computations in the field $\F_q$:
\begin{itemize}\setlength{\itemsep}{0pt}
\item $S_g'$ is regular --- for each $s\in\F_q$, the vertex labels
$s+\frac{\alpha^k-1}{\alpha-1}$ ($0\le k<4g$) are distinct.
\item The $1$-skeleton of $S_g'$ is complete --- for $v,v'\in\F_q$, $v\neq v'$
there is a unique $s\in\F_q$ and $k\in\Z/(4g)$ with
\[
v=s+\frac{\alpha^k-1}{\alpha-1}\qquad
    v'=s+\frac{\alpha^{k+1}-1}{\alpha-1}.
\]
\item The dual graph of $S_g'$ is complete --- for $s,s'\in\F_q$, $s\neq s'$,
there are unique $k,\ell\in\Z/(4g)$ such that
\begin{align*}
s+\frac{\alpha^k-1}{\alpha-1}&=s'+\frac{\alpha^{\ell+1}-1}{\alpha-1} \\
s+\frac{\alpha^{k+1}-1}{\alpha-1}&=s'+\frac{\alpha^\ell-1}{\alpha-1}.
\end{align*}
\end{itemize}
\end{proof}

\begin{theorem}
Let $n \ge 128 g^4$, and let
\[
\rho:H_1(S_g')\ \to\ \Z/n
\]
be a randomly chosen homomorphism, and let $\hS_g$ be the finite cover of
$S_g'$ corresponding to $\rho$. Then with probability more than $\frac12$, the
cellulation of\/ $\hS_g$ is strongly regular.
\label{th:prob}
\end{theorem}

In order to prove \thm{th:prob}, we need to more explicitly describe the
condition of strong regularity as it applies to $\hS_g$. Let $X$ be a regular
cell complex and suppose that its universal cover $\tilde{X}$ is strongly
regular.  Recall that the \emph{star} $\st(v)$ of a vertex $v$ in $X$ is the
subcomplex generated by the cells that contain $v$. The complex $X$ is strongly
regular if and only if the star of each vertex is.  Suppose that $\tilde{v} \in
\tilde{X}$ projects to $v\in X$. Then the star $\st(\tilde{v})$, which is
strongly regular, projects to the star $\st(v)$.  The latter is strongly
regular if and only if the projection is injective.  In other words, $X$ is
strongly regular if and only if the stars of $\tilde{X}$ embed in $X$. If $X$
is not strongly regular, then there must be a path $\tilde{\ell}$ connecting
distinct vertices of $\st(\tilde{v})$ which projects to a loop $\ell$ in
$\st(v)$.  We say that such a loop \emph{obstructs strong regularity}.  We can
assume that $\tilde{\ell}$ is a pair of segments properly embedded in distinct
cells in $\st(\tilde v)$, with only the end-points of the segments on the
boundary of the cells, which implies that $\ell$ is embedded if $X$ is regular.
\fig{f:obstruct} gives an example of such a loop $\ell$ in a regular
cellulation of a torus.

\begin{fullfigure}{f:obstruct}{A loop $\ell$ that obstructs strong regularity
    in the torus $S_1'$}
\pspicture(0,0)(6,4)
\pspolygon[linestyle=none,fillstyle=solid,fillcolor=gray90]
    (0,0)(0,2)(2,2)(2,4)(6,4)(6,0)
\psline(0,0)(6,0) \psline(0,2)(6,2) \psline(2,4)(6,4) \psline(0,0)(0,2)
\psline(2,0)(2,4) \psline(4,0)(4,4) \psline(6,0)(6,4)
\multips(0,0)(2,0){4}{\qdisk(0,0){.1}} \multips(0,2)(2,0){4}{\qdisk(0,0){.1}}
\multips(2,4)(2,0){3}{\qdisk(0,0){.1}}
\rput(1,1){\large $F^1$} \rput(3,1){\large $F^0$} \rput(5,1){\large $F^4$}
\rput(3,3){\large $F^3$} \rput(5,3){\large $F^2$}
\uput[225](0,0){$4$} \uput[270](2,0){$3$} \uput[270](4,0){$2$}
\uput[315](6,0){$1$}
\uput[135](0,2){$2$} \uput[135](2,2){$1$} \uput[135](4,2){$0$}
\uput[45](6,2){$4$}
\uput[135](2,4){$4$} \uput[90](4,4){$3$} \uput[45](6,4){$2$}
\pscurve[linestyle=dashed](2,0)(2.8,.4)(3.6,.8)(3.4,1.6)(4,2)(4.4,3)
    (4.6,3.6)(4,4)
\rput(3.7,.4){\large $\ell$}
\endpspicture
\end{fullfigure}

In our case, the surfaces $S_g'$ are regular, but they have many obstructing
loops.  \thm{th:prob} asserts that, with non-zero probability, all such loops
lengthen when lifted to $\hS_g$.

\begin{lemma} No loops in $S_g'$ that obstruct strong regularity are
null-homologous.  Furthermore, all obstructing loops represent indivisible
elements in $H_1(S_g')$.
\label{l:notnull} \end{lemma}

\begin{proof} In brief, they are indivisible because they are embedded,
and they are too short to be null-homologous.

By \lem{l:regular}, $S_g'$ is regular.  By the discussion after the statement
of \thm{th:prob}, each obstructing loop $\ell$ is embedded. If $\ell$ separates
$S_g'$, then it is null-homologous. If $\ell$ does not separate $S_g'$, then it
is indivisible in homology.  (To show this, we can appeal to the classification
of surfaces by cutting $S_g'$ along $\ell$.  The classification implies that
all non-separating positions for $\ell$ are equivalent up to homeomorphism of
$S_g'$.  It is easy to find a standard position for $\ell$ in which it is
indivisible in homology.) Thus it remains to show that no obstructing loop is
null-homologous.

First, we claim that any obstructing loop $\ell$ can be supported on fewer than
$4g$ edges of the $1$-skeleton of $S_g'$.  We homotop the two segments of
$\ell$ to the boundaries of the 2-cell containing them, giving them each at
most $2g$ edges.  Thus $\ell$ is represented by a sequence of at most $4g$
edges in $S_g'$. The case of exactly $4g$ edges does not occur, since the
endpoints of the loop coincide, and no two vertices $v\neq v'$ of $S_g'$ are
opposite vertices in two different facets $F^s$.  As in \lem{l:regular}, this
follows from the fact that for $v,v'\in\F_g$, $v\neq v'$, there are unique
$s\in\F_q$ and $k\in\Z/(4g)$ with
\[
v = s+\frac{\alpha^k-1}{\alpha-1}\qquad
v' = s+\frac{\alpha^{k+2g}-1}{\alpha-1}.
\]

Second,
we claim that any null-homologous loop in the $1$-skeleton
of $S_g'$ contains at least $4g$ edges.  In other we if $f$ is a $2$-chain on
$S_g'$ and $\d f \ne 0$, then $|\d f| \ge 4g$. Since $S_g'$ is orientable, we
can regard $f$ as a function on its $2$-cells.  Since $f$ is non-constant, it
attains some value $t$ on $k$ $2$-cells with $0 < k < q$.  Since any two
$2$-cells share an edge by \lem{l:regular}, these $2$-cells share
\[
k(q-k) \ge 4g
\]
edges with the complementary set of $2$-cells, of which there are $q-k$.  Since
$\d f$ is non-zero on these edges, $|\d f| \ge 4g$, as desired.
\end{proof}

\begin{proof}[Proof of \thm{th:prob}] In brief, $S_g'$ has fewer than $64g^4$
obstructing loops $\ell$.  For each one,
\[
P\bigl[\rho([\ell]) = 0\bigr] = \frac1n.
\]
The expected number of obstructing loops that lift from $S_g'$ to $\hS_g$
without lengthening is less than $64g^4/n \le \frac12$.  Thus there is a good
chance that all obstructing loops lengthen.

The homology group $H_1(S'_g)$ is a finitely generated free abelian group: It
is isomorphic to $\Z^d$, for $d=1+q(g-1)$. Thus it admits $n^d$ homomorphisms
$\rho$ to $\Z/n$.  Since this is a finite number, choosing one uniformly at
random is well-defined.  If $c$ is any indivisible vector in $\Z^d$, then it is
contained in a basis, and thus $\rho(c)$ is equidistributed. In particular, if
$\ell$ is an obstructing loop, then $[\ell]$ is indivisible by \lem{l:notnull},
so $\rho([\ell])$ is equidistributed in $\Z/n$.

It remains only to bound the number of obstructing loops in $S_g'$. A star
$\st(v)$ in $\tilde{S}_g$ has $4g(4g-2)$ points other than $v$ itself.
Without loss of generality, $v$ projects to $0$ in $S_g'$.  In this case the
other vertices are equidistributed among the $4g$ non-zero elements of
$\F_q$.  Therefore $\st(v)$ has
\[
4g\binom{4g-2}{2}\ =\ \frac{4g(4g-2)(4g-3)}{2}
\]
pairs of arcs connecting $v$ to two vertices that are the same in $S_g'$.
These pairs represent all two-segment obstructing loops that pass through $0$
and a nonzero vertex $v'$ (and some of these loops are homotopic).  If we count
such pairs of arcs for any pair of distinct vertices $v,v'$
of $S_g'$, then we find that the total number is not more than
\[
\binom{4g+1}{2}\binom{4g-2}{2}\ =\
\frac{(4g+1)4g(4g-2)(4g-3)}{4} < 64g^4,
\]
as desired.
\end{proof}

\begin{question} For each $g>1$, what is the maximum fatness of a strongly
regular cellulation of a surface of genus $g$? Equivalently, how many edges are
needed for a strongly regular cellulation of a surface of genus $g$?
\end{question}

\begin{remark}
One interesting alternative to the construction of $S_g'$ is to assume instead
that $q = 4g-1$ is a prime power, and to let $\alpha$ be an element of order
$4g$ in $\F_{q^2}$.  The resulting $q^2$-fold cover $S_g''$ is almost strongly
regular: the only obstructing loops are those that are null homologous in
$S_g$.  Another interesting surface is the modular curve $X(2p)$, where $p$ is
a prime \cite[\S13]{Silverman:gtm}. The inclusion $\Gamma(2p) \subset
\Gamma(2)$ of modular groups induces a projection from $X(2p)$ to the modular
curve $X(2)$, which is a sphere with three cusp points. If we connect two of
these points by an arc which avoids the third, it lifts to a cellulation of
$X(2p)$ with $f$-vector $(p^2-1,\frac{p(p^2-1)}{2},\frac{p^2-1}{2})$. Like
$S_g''$, it has a few obstructing loops. Unfortunately we do not know a way to
use either $S_g''$ or $X(2p)$ to make fat surfaces of lower genus (or
equivalently fewer cells) than $\hS_g$.
\end{remark}

Since \thm{th:prob} provides us with efficient fat surfaces $\hS_g$, the
construction of fat cellulations of $S^3$ only requires efficient cellulations
of the handlebodies $H_1$ and $H_2$ and an efficient way to attach them to
$\hS_g$. In our construction the handlebody cellulations are \emph{a priori}
unrelated to the cellulation of $\hS_g$.  Rather they are transverse after
attachment, and each point of intersection will become a new vertex.  Thus the
question is to position the cellulations to minimize their intersection.

We describe the cellulations in three stages:  first, a
dissection of $H_1$ and $H_2$ individually into $3$-cells; second, their
relative position; and third, their position relative to the cellulation of
$\hS_g$.

Let $\hg$ be the genus of $\hS_g$.  A handlebody $H$ of genus $\hg$ can
be formed by identifying $\hg$ pairs of disks on the surface of a $3$-cell.
The result is a dissection of $H$ into $\hg$ $2$-cells and one $3$-cell,
although it is not a cell complex because there are no $1$-cells or $0$-cells.
We can still ask whether such a dissection is regular or strongly regular; this
one is neither.  However, if we replace each $2$-cell by 3 parallel $2$-cells,
it becomes strongly regular.  An example of the resulting dissection $A$ is
shown in \fig{f:tripled}.

\begin{fullfigure}{f:tripled}
    {A strongly regular dissection $A$ of a handlebody of genus 2}
\pspicture(-4,-2)(4,3)
\psbezier(-2,1.4)(-3,1.4)(-4,0.7)(-4,0)
\psbezier(-2,1.4)(-1,1.4)(-1,0.7)(0,0.7)
\psbezier(0,0.7)(1,0.7)(1,1.4)(2,1.4)
\psbezier(2,1.4)(3,1.4)(4,0.7)(4,0)
\psbezier(-2,-1.4)(-3,-1.4)(-4,-0.7)(-4,0)
\psbezier(-2,-1.4)(-1,-1.4)(-1,-0.7)(0,-0.7)
\psbezier(0,-0.7)(1,-0.7)(1,-1.4)(2,-1.4)
\psbezier(2,-1.4)(3,-1.4)(4,-0.7)(4,0)
\psbezier(1.3,0)(1.8,0.5)(2.3,0.5)(2.8,0)
\psbezier(1.3,0)(1.8,-0.5)(2.3,-0.5)(2.8,0)
\psbezier(-1.3,0)(-1.8,0.5)(-2.3,0.5)(-2.8,0)
\psbezier(-1.3,0)(-1.8,-0.5)(-2.3,-0.5)(-2.8,0)
\psbezier(-2.025,.375)(-1.575,.375)(-1.575,1.4)(-2.025,1.4)
\psbezier[linestyle=dashed](-2.025,.375)(-2.475,.375)(-2.475,1.4)(-2.025,1.4)
\psbezier(-2.425,.3)(-1.975,.3)(-1.975,1.35)(-2.425,1.35)
\psbezier[linestyle=dashed](-2.425,.3)(-2.875,.3)(-2.875,1.35)(-2.425,1.35)
\psbezier(-1.625,.3)(-1.175,.3)(-1.175,1.35)(-1.625,1.35)
\psbezier[linestyle=dashed](-1.625,.3)(-2.075,.3)(-2.075,1.35)(-1.625,1.35)
\psbezier[linestyle=dashed](2.025,.375)(1.575,.375)(1.575,1.4)(2.025,1.4)
\psbezier(2.025,.375)(2.475,.375)(2.475,1.4)(2.025,1.4)
\psbezier[linestyle=dashed](2.425,.3)(1.975,.3)(1.975,1.35)(2.425,1.35)
\psbezier(2.425,.3)(2.875,.3)(2.875,1.35)(2.425,1.35)
\psbezier[linestyle=dashed](1.625,.3)(1.175,.3)(1.175,1.35)(1.625,1.35)
\psbezier(1.625,.3)(2.075,.3)(2.075,1.35)(1.625,1.35)
\endpspicture \end{fullfigure}

The surface $S_\hg$ (which for our choice of $\hg$ is isomorphic to
$\hS_g$) has another standard perfect cellulation called a \emph{canonical
schema} in the computer science literature \cite{VY:surfaces}.  Using the
labelling in \fig{f:sg}, we identify $x_{4k}^{}$ with $x_{4k+2}^{-1}$ (the even
loops), and $x_{4k+1}^{}$ with $x_{4k+3}^{-1}$ (the odd loops), for all $0 \le
k \le \hg$. By rounding corners we can make each even loop intersect one odd
loop once and eliminate all other intersections between loops. If we interpret
this pattern of loops as the standard Heegaard diagram for $S^3$
\cite{Stillwell:gtm}, then the even loops bound disks in $H_1$ and the odd
loops bound disks in $H_2$.  We can then put in two copies $A_1$ and $A_2$ of
the cell division $A$ so that its $2$-cells run parallel to these loops.

We would like to position $A_1$ and $A_2$ to minimize their intersection with
the cellulation of $\hS_g$. (Note that $A_1$ and $A_2$ do not intersect each
other since $\hS_g \times I$ lies in between.) To this end Vegter and Yap
\cite{VY:surfaces} proved that any cellulation of $S_\hg$ with $n$ edges admits
a position of the canonical schema cellulation with $O(n\hg)$ intersections.
(Strictly speaking the theorem applies to triangulations, but any regular
cellulation of a surface with $n$ edges can be refined to a triangulation with
less than $3n$ edges.) In our case
\[
n = \Theta(\hg) = \Theta(g^6).
\]
Thus, by tripling the edges of the canonical schema in the Vegter-Yap
construction, we can position $A_1$ and $A_2$ so that the lean ends in the
sausage have $O(g^{12})$ vertices.  If we give the fat part of the sausage $N =
g^{12}$ slices, the total $f$-vector of the cellulation of $S^3$ is then
\[
(\Theta(g^{12}),\Theta(g^{13}),\Theta(g^{13}),\Theta(g^{12})),
\]
and its fatness is $\Theta(g)$.  This completes the efficient construction
with unbounded fatness.

% \bibliography{me,co,gt,books}

\providecommand{\bysame}{\leavevmode\hbox to3em{\hrulefill}\thinspace}
\begin{thebibliography}{10}

\bibitem{Barnette:inequalities}
David Barnette, \emph{Inequalities for $f$-vectors of $4$-polytopes}, Israel J.
  Math. \textbf{11} (1972), 284--291.

\bibitem{Bayer:extended}
Margaret~M. Bayer, \emph{The extended $f$-vectors of $4$-polytopes}, J.
  Combinatorial Theory Ser. A \textbf{44} (1987), no.~1, 141--151.

\bibitem{BJ:dehn}
Margaret~M. Bayer and Louis~J. Billera, \emph{Generalized {Dehn-Sommerville}
  relations for polytopes, spheres and {Eulerian} partially ordered sets},
  Inventiones Math. \textbf{79} (1985), no.~1, 143--157.

\bibitem{BL:sufficiency}
Louis~J. Billera and Carl~W. Lee, \emph{A proof of the sufficiency of
  {M}c{M}ullen's conditions for $f$-vectors of simplicial convex polytopes}, J.
  Combin. Theory Ser. A \textbf{31} (1981), no.~3, 237--255.

\bibitem{Bollobas:extremal}
B\'ela Bollob\'as, \emph{Extremal graph theory}, Handbook of Combinatorics
  (R.~Graham, M.~Gr\"otschel, and L.~Lov\'asz, eds.), North-Holland/Elsevier,
  Amsterdam, 1995, pp.~1231--1292.

\bibitem{Braden:glued}
Tom Braden, \emph{A glued hypersimplex}, 1997, Personal communication.

\bibitem{CS:splag}
John~H. Conway and Neil J.~A. Sloane, \emph{Sphere packings, lattices and
  groups}, 3rd ed., Grundlehren der mathematischen {Wissenschaften}, vol. 290,
  Springer-Verlag, New York, 1993.

\bibitem{Coxeter:regpoly}
Harold Scott~MacDonald Coxeter, \emph{Regular polytopes}, 2nd ed., Macmillan,
  New York, 1963, Corrected reprint, Dover, New York 1973.

\bibitem{ES:hyperplane}
Herbert Edelsbrunner and Micha Sharir, \emph{A hyperplane incidence problem
  with applications to counting distances}, Applied geometry and discrete
  mathematics: {The Victor Klee Festschrift} (P.~Gritzman and B.~Sturmfels,
  eds.), DIMACS Series in Discrete Mathematics and Theoretical Computer
  Science, vol.~4, Amer. Math. Soc., Providence, RI, 1991, pp.~253--263.

\bibitem{Erdos:primzahlen}
Paul Erd\H{o}s, \emph{{\"Uber} die {Primzahlen} gewisser arithmetischer
  {Reihen}}, Math. Z. \textbf{39} (1935), 473--491.

\bibitem{Kuperberg:saturated}
G\'abor {Fejes T\'oth}, Greg Kuperberg, and W{\l}odzimierz Kuperberg,
  \emph{Highly saturated packings and reduced coverings}, Monatsh. Math.
  \textbf{125} (1998), no.~2, 127--145.

\bibitem{Fulton:gtm}
William Fulton, \emph{Algebraic topology. {A} first course}, Graduate Texts in
  Mathematics, vol. 153, Springer-Verlag, New York, 1995.

\bibitem{Grunbaum:convex}
Branko Gr\"unbaum, \emph{Convex polytopes}, Interscience, London, 1967.

\bibitem{HZ:census}
Andrea H\"oppner and G\"unter~M. Ziegler, \emph{A census of flag-vectors of
  $4$-polytopes}, Polytopes --- combinatorics and computation (G.~Kalai and
  G.M. Ziegler, eds.), DMV Seminars, vol.~29, Birkh\"auser-Verlag, Basel, 2000,
  pp.~105--110.

\bibitem{Iverson:hyperbolic}
Birger Iversen, \emph{Hyperbolic geometry}, London Math. Soc. Student Texts,
  vol.~25, Cambridge University Press, Cambridge, 1992.

\bibitem{JZ:cubical}
Michael Joswig and G\"unter~M. Ziegler, \emph{Neighborly cubical polytopes},
  Discrete Comput. Geom. \textbf{24} (2000), no.~2-3, 325--344,
  \mbox{arXiv:math.CO/9812033}.

\bibitem{KST:problem}
Tam\'as K\H{o}v\'ari, Vera~T. S\'os, and P\'al Tur\'an, \emph{On a problem of
  {K. Zarankiewicz}}, Colloq. Math. \textbf{3} (1954), 50--57.

\bibitem{Kuperberg:kissing}
Greg Kuperberg and Oded Schramm, \emph{Average kissing numbers for
  non-congruent sphere packings}, Math. Res. Lett. \textbf{1} (1994), no.~3,
  339--344, \mbox{arXiv:math.MG/9405218}.

\bibitem{Malcev:faithful}
A.~I. Mal'cev, \emph{On the faithful representation of infinite groups by
  matrices}, Amer. Math. Soc. Transl. (2) \textbf{45} (1965), 1--18.

\bibitem{Malkevitch:tiling}
Joseph Malkevitch, \emph{Tiling convex polygons with equilateral triangles and
  squares}, Discrete Geometry and Convexity (J.~E. Goodman, E.~Lutwak,
  J.~Malkevitch, and R.~Pollack, eds.), Ann. New York Acad. Sci., vol. 440, New
  York Academy of Sciences, 1985, pp.~299--303.

\bibitem{McMullen:simplicial}
Peter McMullen, \emph{The numbers of faces of simplicial polytopes}, Israel J.
  Math. \textbf{9} (1971), 559--570.

\bibitem{Munkres:algtop}
James~R. Munkres, \emph{Elements of algebraic topology}, Addison-Wesley, Menlo
  Park, CA, 1984.

\bibitem{PA:combin}
J\'anos Pach and Pankaj~K. Agarwal, \emph{Combinatorial geometry}, J. Wiley and
  Sons, New York, 1995.

\bibitem{Schulte:steinitz}
Egon Schulte, \emph{Analogues of {Steinitz's} theorem about
  non-in\-scrib\-a\-ble polytopes}, Intuitive geometry (Si\'ofok 1985)
  (Amsterdam), Colloquia Soc. J\'anos Bolyai, vol.~48, North Holland, 1987,
  pp.~503--516.

\bibitem{Silverman:gtm}
Joseph~H. Silverman, \emph{The arithmetic of elliptic curves}, Graduate Texts
  in Mathematics, vol. 106, Springer-Verlag, New York, 1986.

\bibitem{Stanley:simplicial}
Richard~P. Stanley, \emph{The number of faces of a simplicial convex polytope},
  Adv. in Math. \textbf{35} (1980), no.~3, 236--238.

\bibitem{Stanley:eulerian}
\bysame, \emph{A survey of {Eulerian} posets}, Polytopes: abstract, convex and
  computational (Scarborough, ON, 1993), NATO Adv. Sci. Inst. Ser. C Math.
  Phys. Sci., vol. 440, Kluwer Acad. Publ., Dordrecht, 1994, pp.~301--333.

\bibitem{Steinitz:eulerschen}
Ernst Steinitz, \emph{{\"Uber} die {Eulerschen Polyederrelationen}}, Archiv
  f\"ur Mathematik und Physik \textbf{11} (1906), 86--88.

\bibitem{Stillwell:gtm}
John Stillwell, \emph{Classical topology and combinatorial group theory}, 2nd
  ed., Graduate Texts in Mathematics, no.~72, Springer-Verlag, 1993.

\bibitem{Thurston:geometry}
William~P. Thurston, \emph{Three-dimensional geometry and topology}, vol.~I,
  Princeton University Press, Princeton, NJ, 1997.

\bibitem{VY:surfaces}
Gert Vegter and Chee~K. Yap, \emph{Computational complexity of combinatorial
  surfaces}, Proc. 6th ACM Symp. Comp. Geom., ACM Press, 1990, pp.~102--111.

\bibitem{Vinberg:reflection}
Ernest~B. Vinberg, \emph{Hyperbolic reflection groups}, Russian Math. Surveys
  \textbf{40} (1985), 31--75.

\bibitem{Waite:combining}
William Waite, \emph{Combining squares and triangles}, Cubism for Fun
  \textbf{53} (2000), 18--22.

\bibitem{Walkup:lower}
David~W. Walkup, \emph{The lower bound conjecture for $3$- and $4$-manifolds},
  Acta Math. \textbf{125} (1970), 75--107.

\bibitem{Ziegler:gtm}
G\"unter~M. Ziegler, \emph{Lectures on polytopes}, Graduate Texts in
  Mathematics, vol. 152, Springer-Verlag, New York, 1995, Revised edition,
  1998.

\end{thebibliography}


\end{document}

pst-node.tex
%% BEGIN pst-node.tex
%% Generated on <1994/6/7> from `pst-node.doc'.
%% For use with the PostScript header file `pst-node.pro'.
%%
\def\fileversion{93a/b,94beta-97 patch 2}
\def\filedate{1997/07/30}
%%
%% pst-node.tex: Node macros for PSTricks.
%% 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.
%%
\message{ v\fileversion, \filedate}
\csname PSTnodesLoaded\endcsname
\let\PSTnodesLoaded\endinput
\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi\relax
\edef\TheAtCode{\the\catcode`\@}
\catcode`\@=11
\pstheader{pst-node.pro}
\def\pst@nodedict{tx@NodeDict begin }
\def\pst@zapspace#1 #2{%
#1%
\ifx#2\@empty\else\expandafter\pst@zapspace\fi
#2}
\def\pst@getnode#1#2{%
\pst@expandafter\pst@@getnode{#1},,\@nil#2}
\def\pst@@getnode#1,#2,#3\@nil#4{%
\ifx\@empty#3\@empty
\edef#4{/N@\pst@zapspace#1 \@empty\space}%
\else
\pst@cntg=#1\relax
\pst@cnth=#2\relax
\edef#4{/N@M-\ifnum\psmatrixcnt=\z@ 1\else\the\psmatrixcnt\fi
-\the\pst@cntg-\the\pst@cnth\space}%
\fi}
\def\tx@NewNode{NewNode }
\def\pst@newnode#1#2#3#4{%
\leavevmode
\pst@getnode{#1}\pst@thenode
\pst@Verb{%
\pst@nodedict
{#3}
\ifx\psk@name\relax false \else \psk@name true \fi
\pst@thenode
#2
{#4}
\tx@NewNode
end}%
\global\let\psk@name\relax
\pstree@nodehook
\global\let\pstree@nodehook\relax}
\let\pstree@nodehook\relax
\newif\ifnodealign
\def\psset@nodealign#1{\@nameuse{nodealign#1}}
\psset@nodealign{false}
\def\pst@nodealign{%
\pst@dimg=\ht\pst@hbox
\advance\pst@dimg-\dp\pst@hbox
\divide\pst@dimg2
\lower\pst@dimg}
\def\tx@InitPnode{InitPnode }
\def\pnode{\@ifnextchar({\pnode@}{\pnode@(0,0)}}
\def\pnode@(#1)#2{%
\pst@@getcoor{#1}%
\pst@newnode{#2}{10}{\pst@coor}{\tx@InitPnode}%
\ignorespaces}
\def\tx@InitCnode{InitCnode }
\def\cnode{\pst@object{cnode}}
\def\cnode@i{\@ifnextchar({\cnode@ii}{\cnode@ii(0,0)}}
\def\cnode@ii(#1)#2#3{%
\leavevmode
\hbox{%
\use@par
\pst@@getcoor{#1}%
\pssetlength\pst@dimc{#2}%
\pst@dimg=\psk@dimen\pslinewidth
\advance\pst@dimc-\pst@dimg
\advance\pst@dimc.5\pslinewidth
\ifnodealign
\kern\pst@dimc
\vrule width\z@ height \pst@dimc depth \pst@dimc
\fi
\pscircle@do(#1){#2}%
\pst@newnode{#3}{11}{\pst@coor \pst@number\pst@dimc}{\tx@InitCnode}%
% DG/SR modification begin - Jul. 30, 1997
%\ifnodealign \kern\pst@dimc\egroup \fi}%
\ifnodealign\kern\pst@dimc\fi}%
% DG/SR modification end
\ignorespaces}
\def\Cnode{\pst@object{Cnode}}
\def\Cnode@i{\@ifnextchar({\Cnode@ii}{\Cnode@ii(0,0)}}
\def\Cnode@ii(#1)#2{\cnode@ii(#1){\psk@radius}{#2}}%
\def\cnodeput{\pst@object{cnodeput}}
\def\cnodeput@i{\@ifnextchar({\cnodeput@iii}{\cnodeput@ii}}
\def\cnodeput@ii#1{%
\addto@par{rot={#1}}%
\@ifnextchar({\cnodeput@iii}{\cnodeput@iii(\z@,\z@)}}
\def\cnodeput@iii(#1)#2{%
\pst@killglue
\@fixedradiusfalse
\def\pst@nodehook{\cnodeput@iv{#2}}%
\pst@makebox{\cput@v{#1}}}
\def\cnodeput@iv#1{%
\pst@newnode{#1}{11}{\pscirclebox@iv \pst@number\pslinewidth add}%
{\tx@InitCnode}%
\global\let\pst@nodehook\relax}
\def\Cnodeput{\pst@object{Cnodeput}}
\def\Cnodeput@i{\@ifnextchar({\Cnodeput@iii}{\Cnodeput@ii}}
\def\Cnodeput@ii#1{%
\addto@par{rot={#1}}%
\@ifnextchar({\Cnodeput@iii}{\Cnodeput@iii(\z@,\z@)}}
\def\Cnodeput@iii(#1)#2{%
\pst@killglue
\@fixedradiustrue
\def\pst@nodehook{\Cnodeput@iv{#2}}%
\pst@makebox{\cput@iv{#1}}}
\def\Cnodeput@iv#1{%
\pst@newnode{#1}{11}{%
\pst@number{\wd\pst@hbox} 2 div \pst@number\pst@dima % x y
\pst@number\pst@dimb \pst@number\pslinewidth \psk@dimen .5 sub mul sub }% r
{\tx@InitCnode}%
\global\let\pst@nodehook\relax}
\def\circlenode{\pst@object{circlenode}}
\def\circlenode@i#1{\pst@makebox{\circlenode@ii{#1}}}
\def\circlenode@ii#1{%
\begingroup
\pst@useboxpar
\setbox\pst@hbox=\hbox{%
\cnodeput@iv{#1}%
\pscirclebox@iii
\box\pst@hbox}%
\ifnodealign \psboxseptrue \fi
\ifpsboxsep \pscirclebox@sep \fi
\leavevmode
\ifnodealign\pst@nodealign\fi
\box\pst@hbox
\endgroup}
\def\Circlenode{\pst@object{Circlenode}}
\def\Circlenode@i#1{\pst@makebox{\Circlenode@ii{#1}}}
\def\Circlenode@ii#1{%
\begingroup
\pst@useboxpar
\pst@dima=\ht\pst@hbox
\advance\pst@dima\dp\pst@hbox
\divide\pst@dima\tw@
\pssetlength\pst@dimb\psk@radius
\setbox\pst@hbox=\hbox{%
\Cnodeput@iv{#1}%
\pscircle(.5\wd\pst@hbox,\pst@dima){\pst@dimb}%
\box\pst@hbox}%
\ifnodealign \psboxseptrue \fi
\ifpsboxsep \psCirclebox@sep \fi
\leavevmode
\ifnodealign\pst@nodealign\fi
\box\pst@hbox
\endgroup}
\def\tx@GetRnodePos{GetRnodePos }
\def\tx@InitRnode{InitRnode }
\def\rnode{\@ifnextchar[{\rnode@i}{\def\pst@par{}\rnode@ii}}
\def\rnode@i[#1]{\def\pst@par{ref=#1}\rnode@ii}
\def\rnode@ii#1{\pst@makebox{\rnode@iii\rnode@iv{#1}}}
\def\rnode@iii#1#2{%
% Modification D.G. Jan 97
\leavevmode
\begingroup
#1%
\if@star\pst@starbox\fi
\ifnodealign\lower\pst@dimb\fi
\hbox{%
\pst@newnode{#2}{16}{%
\pst@number{\ht\pst@hbox}%
\pst@number{\dp\pst@hbox}%
\pst@number{\wd\pst@hbox}%
\pst@number\pst@dima
\pst@number\pst@dimb}%
{\tx@InitRnode}%
\box\pst@hbox}%
\endgroup}
\def\rnode@iv{%
\pst@dima=\psk@xref\wd\pst@hbox
\ifx\psk@yref\relax
\pst@dimb=\z@
\else
\pst@dimb=\ht\pst@hbox
\advance\pst@dimb\dp\pst@hbox
\pst@dimb=\psk@yref\pst@dimb
\advance\pst@dimb-\dp\pst@hbox
\fi}
\def\psset@href#1{\pst@checknum{#1}\psk@href}
\psset@href{0}
\def\psset@vref#1{\def\psk@vref{#1}}
\psset@vref{.7ex}
\def\Rnode{\pst@object{Rnode}}
\def\Rnode@i#1{\pst@makebox{\rnode@iii\Rnode@ii{#1}}}
\def\Rnode@ii{%
% Changed according pst-beta.bug December 3, 1993
% (\begingroup removed by D.G. as it seems to doesn't work any more)
% \Rnode doesn't process the optional parameter changes.
%\begingroup
\use@par
\pst@dima=\psk@href\wd\pst@hbox
\advance\pst@dima\wd\pst@hbox
\divide\pst@dima 2
\pssetlength\pst@dimb{\psk@vref}}
\def\tx@DiaNodePos{DiaNodePos }
\def\dianode{\pst@object{dianode}}
\def\dianode@i#1{\pst@makebox{\dianode@ii{#1}}}
\def\dianode@ii#1{%
\begingroup
\pst@useboxpar
\psdiabox@iii
\setbox\pst@hbox=\hbox{%
\pst@newnode{#1}{14}{}{%
/X \pst@number\pst@dima def
/Y \pst@number\pst@dimb def
/w \pst@number\pst@dimc 2 mul def
/h \pst@number\pst@dimd 2 mul def
/NodePos { \tx@DiaNodePos } def}%
\box\pst@hbox}%
\ifnodealign\psboxseptrue\fi
\ifpsboxsep\psdiabox@sep\fi
\ifnodealign\lower\pst@dimb\fi
\box\pst@hbox
\endgroup}
\def\tx@TriNodePos{TriNodePos }
\def\tx@InitTriNode{InitTriNode }
\def\trinode{\pst@object{trinode}}
\def\trinode@i#1{\pst@makebox{\trinode@ii{#1}}}
\def\trinode@ii#1{%
\begingroup
\pst@useboxpar
\pstribox@iii
\setbox\pst@hbox=\hbox{%
\pst@newnode{#1}{14}{}{%
\pst@number\pst@dimc
\pst@number\pst@dimd
\ifodd\psk@trimode
exch
\pst@number\pst@dima
\else
\pst@number\pst@dimb
\fi
\psk@trimode
\pst@number{\wd\pst@hbox}%
\pst@number{\ht\pst@hbox}%
\pst@number{\dp\pst@hbox}%
\tx@InitTriNode}%
\box\pst@hbox}%
\ifnodealign\psboxseptrue\fi
\ifpsboxsep\pstribox@sep\fi
\ifnodealign\lower\pst@tempa\fi
\box\pst@hbox
\endgroup}
\def\tx@OvalNodePos{OvalNodePos }
\def\ovalnode{\pst@object{ovalnode}}
\def\ovalnode@i#1{\pst@makebox{\ovalnode@ii{#1}}}
\def\ovalnode@ii#1{%
\begingroup
\pst@useboxpar
\psovalbox@iii
\setbox\pst@hbox=\hbox{%
\pst@newnode{#1}{14}{}{%
/X \pst@number\pst@dima def
/Y \pst@number\pst@dimb def
/w \pst@number\pst@dimc def
/h \pst@number\pst@dimd def
/NodePos { \tx@OvalNodePos } def}%
\unhbox\pst@hbox}%
\ifnodealign\psboxseptrue\fi
\ifpsboxsep\psovalbox@sep\fi
\ifnodealign\lower\pst@dimb\fi
\box\pst@hbox
\endgroup}
\def\dotnode{\pst@object{dotnode}}
\def\dotnode@i{\@ifnextchar({\dotnode@ii}{\dotnode@ii(\z@,\z@)}}
\def\dotnode@ii(#1)#2{%
\leavevmode
\hbox{%
\use@par
\pst@@getcoor{#1}%
\pst@getdotsize
\pstree@nodehook
\ifnodealign
\pst@dima=\pst@dimg
\kern\pst@dima
\vrule width\z@ height \pst@dimh depth \pst@dimh
\fi
\pst@newnode{#2}{14}{}{%
\pst@coor
/Y ED /X ED
/w \pst@number\pst@dimg def
/h \pst@number\pst@dimh def
/NodePos { \tx@OvalNodePos } def}%
\psdot@ii(#1)%
\ifnodealign\kern\pst@dima\fi}%
\ignorespaces}
\def\psset@framesize#1{\pst@expandafter\psset@@framesize{#1} \@nil}
\def\psset@@framesize#1 #2\@nil{%
\pssetlength\pst@dimg{#1}%
\divide\pst@dimg2
\edef\psk@framewidth{\pst@number\pst@dimg}%
\ifx\@empty#2\@empty
\let\psk@frameheight\psk@framewidth
\else
\pssetlength\pst@dimg{#2}%
\divide\pst@dimg2
\edef\psk@frameheight{\pst@number\pst@dimg}%
\fi}
\psset@framesize{10pt}
\def\fnode{\pst@object{fnode}}
\def\fnode@i{\@ifnextchar({\fnode@ii}{\fnode@ii(\z@,\z@)}}
\def\fnode@ii(#1)#2{%
\leavevmode
\pst@killglue
\hbox{%
\use@par
\begin@ClosedObj
\ifnodealign
\kern\psk@framewidth\p@
\vrule width\z@ height \psk@frameheight\p@ depth \psk@frameheight\p@
\edef\pst@coor{0 0 }%
\else
\pst@@getcoor{#1}%
\fi
\pst@newnode{#2}{14}{}{%
\pst@coor
/Y ED /X ED
/d \psk@dimen .5 sub CLW mul neg def
/r \psk@framewidth d add def
/l r neg def
/u \psk@frameheight d add def
/d u neg def
/NodePos { \tx@GetRnodePos } def}%
\addto@pscode{%
/x2 \psk@framewidth CLW \psk@dimen mul sub def
/y2 \psk@frameheight CLW \psk@dimen mul sub def
\pst@coor 2 copy
y2 sub /y1 ED
x2 sub /x1 ED
y2 add /y2 ED
x2 add /x2 ED
\psk@cornersize
1 index 0 eq { pop pop \tx@Rect } { \tx@OvalFrame } ifelse}%
\def\pst@linetype{2}%
\showpointsfalse
\end@ClosedObj
\ifnodealign\kern\psk@framewidth\p@\fi}%
\ignorespaces}
\def\psset@nodesepA#1{%
\pst@getlength{#1}\psk@nodesepA
\def\psk@nodeseptypeA{0 }}
\def\psset@nodesepB#1{%
\pst@getlength{#1}\psk@nodesepB
\def\psk@nodeseptypeB{0 }}
\def\psset@nodesep#1{%
\pst@getlength{#1}\psk@nodesepA
\let\psk@nodesepB\psk@nodesepA
\def\psk@nodeseptypeA{0 }%
\def\psk@nodeseptypeB{0 }}
\psset@nodesep{0pt}
\def\psset@XnodesepA#1{%
\pst@getlength{#1}\psk@nodesepA
\def\psk@nodeseptypeA{1 }}
\def\psset@XnodesepB#1{%
\pst@getlength{#1}\psk@nodesepB
\def\psk@nodeseptypeB{1 }}
\def\psset@Xnodesep#1{%
\pst@getlength{#1}\psk@nodesepA
\let\psk@nodesepB\psk@nodesepA
\def\psk@nodeseptypeA{1 }%
\def\psk@nodeseptypeB{1 }}
\def\psset@YnodesepA#1{%
\pst@getlength{#1}\psk@nodesepA
\def\psk@nodeseptypeA{2 }}
\def\psset@YnodesepB#1{%
\pst@getlength{#1}\psk@nodesepB
\def\psk@nodeseptypeB{2 }}
\def\psset@Ynodesep#1{%
\pst@getlength{#1}\psk@nodesepA
\let\psk@nodesepB\psk@nodesepA
\def\psk@nodeseptypeA{2 }%
\def\psk@nodeseptypeB{2 }}
\def\psset@armA#1{%
\pst@getlength{#1}\psk@armA
\def\psk@armtypeA{0 }}
\def\psset@armB#1{%
\pst@getlength{#1}\psk@armB
\def\psk@armtypeB{0 }}
\def\psset@arm#1{%
\pst@getlength{#1}\psk@armA
\let\psk@armB\psk@armA
\def\psk@armtypeA{0 }%
\def\psk@armtypeB{0 }}
\psset@arm{10pt}
\def\psset@XarmA#1{%
\pst@getlength{#1}\psk@armA
\def\psk@armtypeA{1 }}
\def\psset@XarmB#1{%
\pst@getlength{#1}\psk@armB
\def\psk@armtypeB{1 }}
\def\psset@Xarm#1{%
\pst@getlength{#1}\psk@armA
\let\psk@armB\psk@armA
\def\psk@armtypeA{1 }%
\def\psk@armtypeB{1 }}
\def\psset@YarmA#1{%
\pst@getlength{#1}\psk@armA
\def\psk@armtypeA{2 }}
\def\psset@YarmB#1{%
\pst@getlength{#1}\psk@armB
\def\psk@armtypeB{2 }}
\def\psset@Yarm#1{%
\pst@getlength{#1}\psk@armA
\let\psk@armB\psk@armA
\def\psk@armtypeA{2 }%
\def\psk@armtypeB{2 }}
\def\psset@offsetA#1{\pst@getlength{#1}\psk@offsetA}
\def\psset@offsetB#1{\pst@getlength{#1}\psk@offsetB}
\def\psset@offset#1{\psset@offsetA{#1}\let\psk@offsetB\psk@offsetA}
\psset@offset{0pt}
\def\psset@angleA#1{\pst@getangle{#1}\psk@angleA}
\def\psset@angleB#1{\pst@getangle{#1}\psk@angleB}%
\def\psset@angle#1{%
\pst@getangle{#1}\psk@angleA
\let\psk@angleB\psk@angleA}
\psset@angle{0}
\def\psset@arcangleA#1{\pst@getangle{#1}\psk@arcangleA}
\def\psset@arcangleB#1{\pst@getangle{#1}\psk@arcangleB}%
\def\psset@arcangle#1{%
\pst@getangle{#1}\psk@arcangleA
\let\psk@arcangleB\psk@arcangleA}
\psset@arcangle{8}
\def\psset@ncurvA#1{\pst@checknum{#1}\psk@ncurvA}
\def\psset@ncurvB#1{\pst@checknum{#1}\psk@ncurvB}%
\def\psset@ncurv#1{\psset@ncurvA{#1}\let\psk@ncurvB\psk@ncurvA}
\psset@ncurv{.67}
\def\tx@GetCenter{GetCenter }
\def\tx@XYPos{XYPos }
\def\tx@GetEdge{GetEdge }
\def\tx@AddOffset{AddOffset }
\def\tx@GetEdgeA{GetEdgeA }
\def\tx@GetEdgeB{GetEdgeB }
\def\tx@GetArmA{GetArmA }
\def\tx@GetArmB{GetArmB }
\def\check@arrow#1#2{%
\check@@arrow#2-\@nil
\if@pst
\addto@par{arrows=#2}%
\def\next{#1}%
\else
\def\next{#1{#2}}%
\fi
\next}
\def\check@@arrow#1-#2\@nil{%
\ifx\@nil#2\@nil\@pstfalse\else\@psttrue\fi}
\def\tx@InitNC{InitNC }
\def\nc@object#1#2#3#4#5{%
\csname begin@#1Obj\endcsname
\showpointsfalse
\pst@getnode{#2}\pst@tempa
\pst@getnode{#3}\pst@tempb
\gdef\npos@default{#4 }%
\addto@pscode{%
/NCLW CLW def
\pst@nodedict
\psk@offsetA
\psk@offsetB neg
\psk@nodesepA
\psk@nodesepB
\psk@nodeseptypeA
\psk@nodeseptypeB
\pst@tempa
\pst@tempb
\tx@InitNC { #5 } if
end}%
\def\use@pscode{%
\pst@Verb{gsave \tx@STV newpath \pst@code\space grestore}%
\gdef\pst@code{}}%
\csname end@#1Obj\endcsname
\pst@shortput}
\def\npos@default{.5 }
\def\pc@object#1{%
\@ifnextchar({\pc@@object#1}{\pst@getarrows{\pc@@object#1}}}
\def\pc@@object#1(#2)(#3){%
\pnode(#2){@@A}\pnode(#3){@@B}%
#1{@@A}{@@B}}
\def\tx@LPutLine{LPutLine }
\def\tx@LPutLines{LPutLines }
\def\tx@BezierMidpoint{BezierMidpoint }
\def\tx@HPosBegin{HPosBegin }
\def\tx@HPosEnd{HPosEnd }
\def\tx@HPutLine{HPutLine }
\def\tx@HPutLines{HPutLines }
\def\tx@VPosBegin{VPosBegin }
\def\tx@VPosEnd{VPosEnd }
\def\tx@VPutLine{VPutLine }
\def\tx@VPutLines{VPutLines }
\def\tx@HPutCurve{HPutCurve }
\def\tx@NCCoor{NCCoor }
\def\tx@NCLine{NCLine }
\def\ncline{\pst@object{ncline}}
\def\ncline@i{\check@arrow{\ncline@ii}}
\def\ncline@ii#1#2{\nc@object{Open}{#1}{#2}{.5}{\tx@NCLine}}
\def\pcline{\pst@object{pcline}}
\def\pcline@i{\pc@object\ncline@ii}
\def\ncLine{\pst@object{ncLine}}
\def\ncLine@i{\check@arrow{\ncLine@ii}}
\def\ncLine@ii#1#2{\nc@object{Open}{#1}{#2}{.5}%
{\tx@NCLine /LPutPos { xB xA yB yA \tx@LPutLine } def}}
\def\tx@NCLines{NCLines }
\def\nclines{\pst@object{nclines}}
\def\nclines@i{\check@arrow\nclines@ii}
\def\nclines@ii#1#2{%
\begingroup
\use@par
\def\pst@aftercoors{\nclines@iii{#1}{#2}}%
\def\pst@coors{}%
\pst@@getcoors}
\def\nclines@iii#1#2{%
\nc@object{Open}{#1}{#2}{.5}{%
tx@Dict begin \psline@iii pop end
mark \pst@coors \tx@NCLines}%
\endgroup
\ignorespaces}
\def\tx@NCCurve{NCCurve }
\def\nccurve{\pst@object{nccurve}}
\def\nccurve@i{\check@arrow{\nccurve@ii}}
\def\nccurve@ii#1#2{\nc@object{Open}{#1}{#2}{.5}{%
/AngleA \psk@angleA\space def /AngleB \psk@angleB\space def
\psk@ncurvB\space \psk@ncurvA\space
\tx@NCCurve}}
\def\pccurve{\pst@object{pccurve}}
\def\pccurve@i{\pc@object\nccurve@ii}
\def\ncarc{\pst@object{ncarc}}
\def\ncarc@i{\check@arrow{\ncarc@ii}}
\def\ncarc@ii#1#2{\nc@object{Open}{#1}{#2}{.5}{%
yB yA sub xB xA sub \tx@Atan dup
\psk@arcangleA\space add /AngleA ED
\psk@arcangleB\space sub 180 add /AngleB ED
\psk@ncurvB\space \psk@ncurvA\space
\tx@NCCurve}}
\def\pcarc{\pst@object{pcarc}}
\def\pcarc@i{\pc@object\ncarc@ii}
\def\tx@NCAngles{NCAngles }
\def\ncangles{\pst@object{ncangles}}
\def\ncangles@i{\check@arrow{\ncangles@ii}}
\def\ncangles@ii#1#2{%
\nc@object{Open}{#1}{#2}{1.5}{\ncangles@iii \tx@NCAngles}}
\def\ncangles@iii{%
tx@Dict begin \psline@iii pop end
/AngleA \psk@angleA def
/AngleB \psk@angleB def
/ArmA \psk@armA def
/ArmB \psk@armB def
/ArmTypeA \psk@armtypeA def
/ArmTypeB \psk@armtypeB def }
\def\pcangles{\pst@object{pcangles}}
\def\pcangles@i{\pc@object\ncangles@ii}
\def\tx@NCAngle{NCAngle }
\def\ncangle{\pst@object{ncangle}}
\def\ncangle@i{\check@arrow{\ncangle@ii}}
\def\ncangle@ii#1#2{%
\nc@object{Open}{#1}{#2}{1.5}{\ncangles@iii \tx@NCAngle}}
\def\pcangle{\pst@object{pcangle}}
\def\pcangle@i{\pc@object\ncangle@ii}
\def\tx@NCBar{NCBar }
\def\ncbar{\pst@object{ncbar}}
\def\ncbar@i{\check@arrow{\ncbar@ii}}
\def\ncbar@ii#1#2{\nc@object{Open}{#1}{#2}{1.5}{%
\ncangles@iii /AngleB \psk@angleA def \tx@NCBar}}
\def\pcbar{\pst@object{pcbar}}
\def\pcbar@i{\pc@object\ncbar@ii}
\def\tx@NCDiag{NCDiag }
\def\ncdiag{\pst@object{ncdiag}}
\def\ncdiag@i{\check@arrow{\ncdiag@ii}}
\def\ncdiag@ii#1#2{%
\nc@object{Open}{#1}{#2}{1.5}{\ncangles@iii \tx@NCDiag}}
\def\pcdiag{\pst@object{pcdiag}}
\def\pcdiag@i{\pc@object\ncdiag@ii}
\def\tx@NCDiagg{NCDiagg }
\def\ncdiagg{\pst@object{ncdiagg}}
\def\ncdiagg@i{\check@arrow{\ncdiagg@ii}}
\def\ncdiagg@ii#1#2{%
\nc@object{Open}{#1}{#2}{.5}{\ncangles@iii \tx@NCDiagg}}
\def\pcdiagg{\pst@object{pcdiagg}}
\def\pcdiagg@i{\pc@object\ncdiagg@ii}
\def\tx@NCLoop{NCLoop }
\def\psset@loopsize#1{\pst@getlength{#1}\psk@loopsize}
\psset@loopsize{1cm}
\def\ncloop{\pst@object{ncloop}}
\def\ncloop@i{\check@arrow{\ncloop@ii}}
\def\ncloop@ii#1#2{%
\nc@object{Open}{#1}{#2}{2.5}%
{\ncangles@iii /loopsize \psk@loopsize def \tx@NCLoop}}
\def\pcloop{\pst@object{pcloop}}
\def\pcloop@i{\pc@object\ncloop@ii}
\def\tx@NCCircle{NCCircle }
\def\nccircle{\pst@object{nccircle}}
\def\nccircle@i{\check@arrow{\nccircle@ii}}
\def\nccircle@ii#1#2{%
\pssetlength\pst@dima{#2}%
\nc@object{Open}{#1}{#1}{.5}{%
/AngleA \psk@angleA def
/r \pst@number\pst@dima def
\tx@NCCircle \psarc@v end}}
\def\tx@NCBox{NCBox }
\def\ncbox{\pst@object{ncbox}}
\def\ncbox@i{\check@arrow{\ncbox@ii}}
\def\ncbox@ii#1#2{%
\def\pst@linetype{2}%
\nc@object{Closed}{#1}{#2}{.5}{%
tx@Dict begin \psline@iii pop end
\psk@boxheight \psk@boxdepth
\tx@NCBox}}
\def\pcbox{\pst@object{pcbox}}
\def\pcbox@i{\pc@object\ncbox@ii}
\def\tx@NCArcBox{NCArcBox }
\def\psset@boxheight#1{\pst@getlength{#1}\psk@boxheight}
\def\psset@boxdepth#1{\pst@getlength{#1}\psk@boxdepth}
\def\psset@boxsize#1{%
\psset@boxheight{#1}%
\let\psk@boxdepth\psk@boxheight}
\psset@boxsize{.4cm}
\def\ncarcbox{\pst@object{ncarcbox}}
\def\ncarcbox@i{\check@arrow{\ncarcbox@ii}}
\def\ncarcbox@ii#1#2{%
\def\pst@linetype{1}%
\nc@object{Closed}{#1}{#2}{.5}{%
\psk@arcangleA \psk@boxheight \psk@boxdepth \pst@number\pslinearc
\tx@NCArcBox}}
\def\pcarcbox{\pst@object{pcarcbox}}
\def\pcarcbox@i{\pc@object\ncarcbox@ii}
\def\tx@Tfan{Tfan }
% Changed according pst-beta.bug December 3, 1993
% nrot=:<angle> does not work when : is active.
\begingroup
\catcode`\:=13
\gdef\pst@activerot{\def:{\string:}}
\endgroup
\def\psset@nrot#1{%
\begingroup
\pst@activerot
\pst@expandafter{\@ifnextchar:{\psset@@nrot}{\psset@@rot}}{#1}\@nil
\global\let\pst@tempg\psk@rot
\endgroup
\let\psk@nrot\pst@tempg}
\def\psset@@nrot:#1\@nil{%
\psset@@rot#1\@nil
\edef\psk@rot{NAngle \ifx\psk@rot\@empty\else\psk@rot add \fi}}
\psset@nrot{0}
\def\tx@LPutCoor{LPutCoor }
\def\tx@LPut{LPut }
\def\psset@npos#1{%
\def\pst@tempa{#1}%
\ifx\pst@tempa\@empty
\def\psk@npos{\npos@default}%
\else
\pst@checknum{#1}\psk@npos
\fi}
\psset@npos{}
\def\ncput{\pst@object{ncput}}
\def\ncput@i{\pst@killglue\pst@makebox{\ncput@ii}}
\def\ncput@ii{%
\begingroup
\use@par
\if@star\pst@starbox\fi
\pst@makesmall\pst@hbox
\pst@rotate\psk@nrot\pst@hbox
\ncput@iii
\endgroup
\pst@shortput}
\def\ncput@iii{%
\leavevmode
\hbox{%
\pst@Verb{%
\pst@nodedict
/t \psk@npos def
\tx@LPut
end
\tx@PutBegin}%
\box\pst@hbox
\pst@Verb{\tx@PutEnd}}}
\def\naput{\pst@object{naput}}
\def\naput@i{\pst@killglue\pst@makebox{\naput@ii{NAngle 90 add}}}
\def\naput@ii#1{%
\begingroup
\use@par
\if@star\pst@starbox\fi
\def\psk@refangle{#1 }%
\let\psk@rot\psk@nrot
\uput@vii
{exch pop add a \tx@PtoC h1 add exch w1 add exch }%
{tx@Dict /NCLW known { NCLW add } if }%
\ncput@iii
\endgroup
\pst@shortput}
\def\nbput{\pst@object{nbput}}
\def\nbput@i{\pst@killglue\pst@makebox{\naput@ii{NAngle 90 sub}}}
\def\psset@tpos#1{%
\pst@checknum{#1}\psk@tpos
\ifdim\psk@tpos \p@<\z@
\def\psk@tpos{.5}%
\@pstrickserr{Bad `tpos' value: `#1'. Must be 0<tpos<1}\@epha
\else
\ifdim\psk@tpos \p@>\p@
\def\psk@tpos{.5}%
\@pstrickserr{Bad `tpos' value: `#1'. Must be 0<tpos<1}\@epha
\fi
\fi}
\psset@tpos{.5}
\def\tvput{\pst@object{tvput}}
\def\tvput@i{\pst@makebox{\psput@tput{H}{1}}}
\def\tlput{\pst@object{tlput}}
\def\tlput@i{\pst@makebox{\psput@tput{H}{true}}}
\def\trput{\pst@object{trput}}
\def\trput@i{\pst@makebox{\psput@tput{H}{false}}}
\def\thput{\pst@object{thput}}
\def\thput@i{\pst@makebox{\psput@tput{V}{1}}}
\def\taput{\pst@object{taput}}
\def\taput@i{\pst@makebox{\psput@tput{V}{true}}}
\def\tbput{\pst@object{tbput}}
\def\tbput@i{\pst@makebox{\psput@tput{V}{false}}}
\def\tx@HPutAdjust{HPutAdjust }
\def\tx@VPutAdjust{VPutAdjust }
\def\psput@tput#1#2{%
\begingroup
\use@par
\pst@tputmakesmall
\leavevmode
\hbox{%
\pst@Verb{%
\pst@nodedict
/t \psk@tpos \pst@tposflip def
tx@NodeDict /HPutPos known
{ #1PutPos }
{ CP /Y ED /X ED /NAngle 0 def /NCLW 0 def }
ifelse
/Sin NAngle sin def
/Cos NAngle cos def
/s \pst@number\pslabelsep NCLW add def
/l \pst@number\pst@dima def
/r \pst@number\pst@dimb def
/h \pst@number\pst@dimc def
/d \pst@number\pst@dimd def
\ifnum1=0#2\else
/flag #2 def
\csname tx@#1PutAdjust\endcsname
\fi
\tx@LPutCoor
end
\tx@PutBegin}%
\box\pst@hbox
\pst@Verb{\tx@PutEnd}}%
\endgroup
\pst@shortput}
\def\pst@tposflip{}
\def\pst@tputmakesmall{%
\pst@dima=\wd\pst@hbox
\divide\pst@dima 2
\pst@dimg=\psk@href\pst@dimg
\pst@dimb\pst@dima
\advance\pst@dima\pst@dimg % leftsize
\advance\pst@dimb-\pst@dimg % rightsize
\pst@dimd=\psk@vref\relax
\pst@dimc=\ht\pst@hbox
\advance\pst@dimc-\pst@dimd % height
\advance\pst@dimd\dp\pst@hbox % depth
\setbox\pst@hbox=\hbox to\z@{%
\kern-\pst@dima\vbox to\z@{\vss\box\pst@hbox\vskip-\pst@dimd}\hss}}
\def\MakeShortNab#1#2{%
  \def\pst@shortput@nab{%
    \def\pst@tempg{\next}%
    \ifx#1\next
      \let\pst@tempg\naput
    \else
      \ifx#2\next
        \let\pst@tempg\nbput
      \else
        \ifx\@sptoken\next
          \let\pst@tempg\pst@shortput
        \fi
      \fi
    \fi
    \pst@tempg}}
\MakeShortNab{^}{_}
\def\MakeShortTablr#1#2#3#4{%
  \def\pst@shortput@tablr{%
    \def\pst@tempg{\next}%
    \ifx#1\next
      \let\pst@tempg\taput
    \else
      \ifx#2\next
        \let\pst@tempg\tbput
      \else
        \ifx#3\next
          \let\pst@tempg\tlput
        \else
          \ifx#4\next
            \let\pst@tempg\trput
          \else
            \ifx\@sptoken\next
              \let\pst@tempg\pst@shortput
            \fi
          \fi
        \fi
      \fi
    \fi
    \pst@tempg}}
\MakeShortTablr{^}{_}{<}{>}
\def\MakeShortTab#1#2{%
  \def\pst@shortput@tab{%
    \def\pst@tempg{\next}%
    \ifx#1\next
      \def\pst@tempg{%
        \@nameuse{%
          t\ifodd\psk@treemode\ifpstreeflip b\else a\fi
          \else\ifpstreeflip r\else l\fi\fi put}}%
    \else
      \ifx#2\next
        \def\pst@tempg{%
          \@nameuse{%
            t\ifodd\psk@treemode\ifpstreeflip a\else b\fi
            \else\ifpstreeflip l\else r\fi\fi put}}%
      \else
        \ifx\@sptoken\next
          \let\pst@tempg\pst@shortput
        \fi
      \fi
    \fi
    \pst@tempg}}
\MakeShortTab{^}{_}
\def\psset@shortput#1{%
\def\pst@tempg{#1}%
\ifx\pst@tempg\@none
\let\pst@shortput\ignorespaces
\else
\@ifundefined{pst@shortput@#1}%
{\@pstrickserr{Bad short put: `#1'}\@ehpa}%
{\edef\pst@shortput{\noexpand\afterassignment\expandafter\noexpand
\csname pst@shortput@#1\endcsname\noexpand\let\noexpand\next}}%
\fi}
\psset@shortput{none}
\def\lput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\lput@i}{\lput@ii}}}
\def\lput@i[#1]{\addto@par{ref=#1}\lput@ii}
\def\lput@ii{\@ifnextchar({\lput@iv}{\lput@iii}}
\def\lput@iii#1{\addto@par{nrot=#1}\@ifnextchar({\lput@iv}{\ncput@i}}
\def\lput@iv(#1){\addto@par{npos=#1}\ncput@i}
\def\mput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\mput@i}{\ncput@i}}}
\def\mput@i[#1]{\addto@par{ref=#1}\ncput@i}
\def\Lput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\Lput@ii}{\Lput@i}}}
\def\Lput@i#1{\addto@par{labelsep=#1}\Lput@ii}
\def\Lput@ii[#1]{\addto@par{ref={#1}}\@ifnextchar({\Lput@iv}{\Lput@iii}}
\def\Lput@iii#1{\addto@par{nrot={#1}}\@ifnextchar({\Lput@iv}{\Lput@v}}
\def\Lput@iv(#1){\addto@par{npos=#1}\Lput@v}
\def\Lput@v{\pst@killglue\pst@makebox{\Lput@vi}}
\def\Lput@vi{%
\begingroup
\use@par
\if@star\pst@starbox\fi
\Rput@vi
\pst@makesmall\pst@hbox
\pst@rotate\psk@nrot\pst@hbox
\ncput@iii
\endgroup
\pst@shortput}
\def\Mput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\Mput@ii}{\Mput@i}}}
\def\Mput@i#1{\addto@par{labelsep=#1}\Mput@ii}
\def\Mput@ii[#1]{\addto@par{ref={#1}}\Lput@v}
\def\aput@#1{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\aput@i#1}{\aput@ii#1}}}
\def\aput@i#1[#2]{\addto@par{labelsep=#2}\aput@ii#1}
\def\aput@ii#1{\@ifnextchar({\aput@iv#1}{\aput@iii#1}}
\def\aput@iii#1#2{\addto@par{nrot=#2}\@ifnextchar({\aput@iv#1}{#1}}
\def\aput@iv#1(#2){\addto@par{npos=#2}#1}
\def\aput{\aput@\naput@i}
\def\bput{\aput@\nbput@i}
\def\Aput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\Aput@i}{\naput@i}}}
\def\Aput@i[#1]{\addto@par{labelsep=#1}\naput@i}
\def\Bput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\Bput@i}{\nbput@i}}}
\def\Bput@i[#1]{\addto@par{labelsep=#1}\nbput@i}
\def\node@coor#1;#2\@nil{%
\pst@getnode{#1}\pst@tempg
\edef\pst@coor{%
\pst@nodedict
tx@NodeDict \pst@tempg known
{ \pst@tempg load \tx@GetCenter }
{ 0 0 }
ifelse
end }}
\def\Node@coor[#1]#2;#3\@nil{%
\begingroup
\psset{#1}%
\@ifnextchar\bgroup{\Node@@@coor}{\Node@@coor}#2\@nil
\endgroup
\let\pst@coor\pst@tempg}
\def\Node@@coor#1\@nil{%
\pst@getnode{#1}\pst@tempg
\xdef\pst@tempg{%
\pst@nodedict
tx@NodeDict \pst@tempg known
{ \psk@nodesepA \psk@angleA
\pst@tempg load \psk@nodeseptypeA \tx@GetEdge
\psk@offsetA \psk@angleA \tx@AddOffset
\pst@tempg load \tx@GetCenter
3 -1 roll add 3 1 roll add exch }
{ CP }
ifelse
end }}%
\def\Node@@@coor#1{%
\pst@@getcoor{#1}%
\def\psk@angleA{%
\pst@tempg load \tx@GetCenter \pst@coor
3 -1 roll sub 3 1 roll sub neg \tx@Atan}%
\Node@@coor}
\def\nput{\pst@object{nput}}
\def\nput@i#1#2{\pst@killglue\pst@makebox{\nput@ii{#1}{#2}}}
\def\nput@ii#1#2{%
\begingroup
\use@par
\psset@refangle{#1}%
\let\psk@angleA\psk@refangle
\edef\psk@nodesepA{\pst@number\pslabelsep}%
\def\psk@nodeseptypeA{0 }%
\pslabelsep\z@
\uput@vi
\Node@@coor#2\@nil
\let\pst@coor\pst@tempg
\leavevmode
\psput@special\pst@hbox
\endgroup
\ignorespaces}
\newcount\psrow
\newcount\pscol
\newcount\psmatrixcnt
\newskip\psrowsep
\newskip\pscolsep
\def\psset@colsep#1{\pssetlength\pscolsep{#1}}
\def\psset@rowsep#1{\pssetlength\psrowsep{#1}}
\psset@colsep{1.5cm}
\psset@rowsep{1.5cm}
\newif\ifpsmatrix
% Modification Denis GIROU (CNRS/IDRIS - France) - &lt;Denis.Girou@idris.fr&gt; -  5 Sep. 1996
% Workaround for problem with \psspan with LaTeX 2e
% (still correct in compatibility mode)
% This workaround is not beautiful, and can perhaps introduce problems
% in other contexts, but I haven't a better one...
%
% modified again by S Rahtz
% 1997/03/25; dont use \newcount\mscount\def\iterate{}
\let\mscount\@multicnt
\def\psmatrix{%
\begingroup
{\ifnum0=`}\fi % Don't want to expand any &.
\@ifnextchar[{\psmatrix@i}{\ifnum0=`{\fi}{}\psmatrix@ii}}
\def\psmatrix@i[#1]{%
\ifnum0=`{\fi}{}%
\psset{#1}%
\psmatrix@ii}
\def\psmatrix@ii{%
\KillGlue
\edef\psm@beginmath{%
\ifmmode$\m@th\ifinner\textstyle\else\displaystyle\fi\fi}%
\edef\psm@endmath{\ifmmode$\fi}%
\let\\\psm@cr
\advance\psmatrixcnt 1
\def\psm@thenode{M-\the\psmatrixcnt-\the\psrow-\the\pscol}%
\tabskip\z@
\psrow1
\pscol\z@
\psset@shortput{tablr}%
\leavevmode
\vbox\bgroup\halign\bgroup&%
\begingroup
\global\advance\pscol 1
\csname psrowhook\romannumeral\psrow\endcsname
\csname pscolhook\romannumeral\pscol\endcsname
\psm@beginnode##\psm@endnode\endgroup
\cr}
\def\endpsmatrix{%
\crcr\egroup\unskip\egroup
\endgroup}
\def\psm@cr{{\ifnum0=`}\fi\@ifnextchar[{\psm@@cr}{\psm@@@cr{}}}
\def\psm@@cr[#1]{\psm@@@cr{\vskip#1\relax}}
\def\psm@@@cr#1{%
\ifnum0=`{\fi}{}\cr
\noalign{%
\global\advance\psrow 1
\global\pscol\z@
\vskip\psrowsep
#1}}
\def\psm@beginnode{%
\@ifnextchar\psm@endnode
{\let\psm@endnode@i\relax\setbox\pst@hbox=\hbox{}}%
{\pst@object{psm@beginnode}}}
\def\psm@beginnode@i{%
\setbox\pst@hbox=\hbox\bgroup
\psm@beginmath
\begingroup
\ignorespaces}
\def\psm@endnode@i{%
\unskip
\endgroup
\psm@endmath
\egroup
\use@par
\@psttrue}
\def\psm@endnode{%
\@pstfalse
\psm@endnode@i
\ifnum\pscol>1 \hskip\pscolsep \fi
\psk@mnodesize
\hfil
\nodealigntrue
\if@pst
\csname mnode@\psk@mnode\endcsname
\else
\csname mnode@\psk@emnode\endcsname
\fi
\psk@mcol
\psk@@mnodesize}
\def\psspan#1{\mscount#1\relax\loop\ifnum\mscount>\@ne \sp@n\repeat}
\def\psset@name#1{\pst@getnode{#1}\psk@name}
\let\psk@name\relax
\def\psset@mcol#1{%
\ifx r#1\relax
\let\psk@mcol\relax
\else
\ifx l#1\relax
\let\psk@mcol\hfill
\else
\let\psk@mcol\hfil
\fi
\fi}
\psset@mcol{c}
\def\psset@mnodesize#1{%
\pssetlength\pst@dimg{#1}%
\ifdim\pst@dimg<\z@
\let\psk@mnodesize\relax
\let\psk@@mnodesize\relax
\else
\edef\psk@mnodesize{\noexpand\hbox to\number\pst@dimg sp\noexpand\bgroup}%
\let\psk@@mnodesize\egroup
\fi}
\psset@mnodesize{-1pt}
\def\mnode@R{\rnode@iii\Rnode@ii{\psm@thenode}}
\def\mnode@r{\rnode@iii\rnode@iv{\psm@thenode}}
\def\mnode@oval{\ovalnode@ii{\psm@thenode}}
\def\mnode@tri{\trinode@ii{\psm@thenode}}
\def\mnode@dia{\dianode@ii{\psm@thenode}}
\def\mnode@C{{\nodealigntrue\cnode@ii(\z@,\z@){\psk@radius}{\psm@thenode}}}
\def\mnode@f{{\nodealigntrue\fnode@ii(\z@,\z@){\psm@thenode}}}
\def\mnode@circle{\circlenode@ii{\psm@thenode}}
\def\mnode@p{\pnode(\z@,\z@){\psm@thenode}}
% DG/SR modification begin - Jul. 22, 1997
\def\mnode@dot{\dotnode@ii(\z@,\z@){\psm@thenode}}
% DG/SR modification end
\def\mnode@none{\box\pst@hbox}
\def\psset@mnode#1{%
\@ifundefined{mnode@#1}%
{\@pstrickserr{\string\psmatrix\space node `#1' not defined.}\@ehpa}%
{\edef\psk@mnode{#1}}}
\def\psset@emnode#1{%
\@ifundefined{mnode@#1}%
{\@pstrickserr{\string\psmatrix\space node `#1' not defined.}\@ehpa}%
{\edef\psk@emnode{#1}}}
\psset@mnode{R}
\psset@emnode{none}
%%%% FROM pst-coil.tex
\def\nccoil{\pst@object{nccoil}}
\def\nccoil@i{\check@arrow{\nccoil@ii}}
\def\nccoil@ii#1#2{\nc@object{Open}{#1}{#2}{.5}{%
\tx@NCCoor
tx@Dict begin
\psk@coilwidth \pscoilheight
\psk@coilarmA \psk@coilarmB
\psk@coilaspect \psk@coilinc
\pst@coildict \tx@Coil end
end}}
\def\nczigzag{\pst@object{nczigzag}}
\def\nczigzag@i{\check@arrow{\nczigzag@ii}}
\def\nczigzag@ii#1#2{\nc@object{Open}{#1}{#2}{.5}{%
\tx@NCCoor
tx@Dict begin
\pscoilheight
\psk@coilwidth
\psk@coilarmA
\psk@coilarmB
\pst@coildict \tx@ZigZag end
\psline@iii
\tx@Line
end}}
\catcode`\@=\TheAtCode\relax
\endinput
%%
%% END pst-node.tex


pstricks.tex
%% BEGIN: pstricks.tex
%% Generated on <1994/6/16> from `pstricks.doc'.
%% For use with the PostScript header file `pstricks.pro'.
%%
\def\fileversion{93a/b-97 patch 3}
\def\filedate{1997/07/11}
%%
%% pstricks.tex: Main input file for the PSTricks package.
%% PostScript macros for Generic TeX.
%% 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
\newtoks\pst@toks
\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{%
\pst@@divide{#1}{#2}%
\pst@dimtonum\pst@dimg{#3}}
\def\pst@@divide#1#2{%
\pst@dimg=#1\relax
\pst@dimh=#2\relax
\pst@cntg=\pst@dimh
\pst@cnth=67108863
\pst@@@divide\pst@@@divide\pst@@@divide\pst@@@divide
\divide\pst@dimg\pst@cntg}
\def\pst@@@divide{%
\ifnum
\ifnum\pst@dimg<\z@-\fi\pst@dimg<\pst@cnth
\multiply\pst@dimg\sixt@@n
\else
\divide\pst@cntg\sixt@@n
\fi}
\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=\tw@-\fi\the\pst@cntg.%
\expandafter\@gobble\the\pst@cnth\space}%
\fi}
\def\pst@@checknum{%
\@ifnextchar-%
{\let\pst@num\tw@\expandafter\pst@@@checknum\@gobble}%
{\let\pst@num\@ne\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
\@psttrue
\ifdim\pst@tempg\p@=\z@
\@pstrickserr{Bad scaling argument `#1'}\@ehpa
\def\pst@tempg{1 }%
\@pstfalse
\fi
\ifdim\pst@temph\p@=\z@
\if@pst\@pstrickserr{Bad scaling argument `#1'}\@ehpa\fi
\def\pst@temph{1 }%
\fi
\edef#2{\pst@tempg\space \pst@temph\space scale }%
\ifdim\pst@tempg\p@=\p@ \ifdim\pst@temph\p@=\p@
\def#2{}%
\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{%
\begingroup
\pst@activecoor
\xdef\pst@tempg{##1}%
\endgroup
\expandafter\special@coor\pst@tempg||\@nil}%
\def\pst@@getangle##1{%
\begingroup
\pst@activecoor
\xdef\pst@tempg{##1}%
\endgroup
\expandafter\special@angle\pst@tempg\@empty)\@nil}%
\def\psput@##1{\pst@@getcoor{##1}\leavevmode\psput@special}}
\begingroup
\catcode`\|=13
\catcode`\;=13
\catcode`\!=13
\gdef\pst@activecoor{%
\def|{\string|}%
\def;{\string;}%
\def!{\string!}}
\endgroup
\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\pst@missing{%
\z@
\@pstrickserr{Missing number or dimension. 0 substituted}\@ehpa}
\def\psset@dash#1{%
\pst@expandafter\psset@@dash{#1} {\pst@missing} {\pst@missing} {}\@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}
\newif\ifpsdashadjust
\def\psset@dashadjust#1{\@nameuse{psdashadjust#1}}
\psset@dashadjust{true}
\def\psls@dashed{%
\ifpsdashadjust
\psk@dash \pst@linetype\space \tx@DashLine
\else
[ \psk@dash ] 0 setdash stroke
\fi}
\def\tx@DashLine{DashLine }
\def\psset@dotsep#1{\pst@getlength{#1}\psk@dotsep}
\psset@dotsep{3pt}
\def\psls@dotted{%
\ifpsdashadjust
\psk@dotsep \pst@linetype\space \tx@DotLine
\else
[ 0 \psk@dotsep CLW add ] 0 setdash 1 setlinecap stroke
\fi}
\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@fill{\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\pst@linefill{%
\psk@hatchangle rotate
\psk@hatchwidth SLW
\pst@usecolor\pshatchcolor
\psk@hatchsep \tx@LineFill}
\def\psfs@vlines{\pst@fill\pst@linefill}
\@namedef{psfs@vlines*}{\psfs@solid \psfs@vlines}
\def\psfs@hlines{\pst@fill{90 rotate \pst@linefill}}
\@namedef{psfs@hlines*}{\psfs@solid \psfs@hlines}
\def\psfs@crosshatch{\psfs@vlines \psfs@hlines}
\@namedef{psfs@crosshatch*}{\psfs@solid \psfs@vlines \psfs@hlines}
\def\tx@LineFill{LineFill }
\def\psset@fillstyle#1{%
\edef\pst@tempg{#1}\def\pst@temph{none}%
\ifx\pst@tempg\pst@temph
\let\psk@fillstyle\relax
\else
\@ifundefined{psfs@#1}%
{\@pstrickserr{Undefined fill style: `#1'}\@eha}%
{\edef\psk@fillstyle{\expandafter\noexpand\csname psfs@#1\endcsname}}%
\fi}
\def\psset@addfillstyle#1{%
\@ifundefined{psfs@#1}%
{\@pstrickserr{Undefined fill style: `#1'}\@eha}%
{\edef\psk@fillstyle{%
\expandafter\noexpand\psk@fillstyle
\expandafter\noexpand\csname psfs@#1\endcsname}}}
\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} 0 {} {}\@nil
\edef\psk@arrowsize{\pst@number\pst@dimg \pst@tempg}}
\psset@arrowsize{1.5pt 2}
\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} 0 {} {}\@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}
\@namedef{psas@>|}{%
\psk@tbarsize \tx@Tbar
0 CLW 2 div T
newpath
false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow}
\@namedef{psas@>|*}{%
0 CLW -2 div T
\psk@tbarsize \tx@Tbar
0 CLW 2 div T
newpath
false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow}
\edef\pst@arrowtable{\pst@arrowtable,|<*->|*,|<->|}
\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\tx@SD{SD }
\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}
\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\addbefore@par#1{%
\ifx\pst@par\@empty
\def\pst@par{#1}%
\else
\toks@{#1}%
\pst@toks\expandafter{\pst@par}%
\edef\pst@par{\the\toks@,\the\pst@toks}%
\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}}%
{\def\pst@par{}\@nameuse{#1@i}}}}
\def\pst@@object#1[#2]{%
\def\pst@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}{\pst@object{#1}}%
\@namedef{#1@i}{\addbefore@par{#3}\@nameuse{#2@i}}}%
\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
\psk@fillstyle
\pst@stroke
\ifpsdoubleline \pst@doublestroke \fi
\ifshowpoints
% Modification Denis GIROU (CNRS/IDRIS - France) - &lt;Denis.Girou@idris.fr&gt; -  4 Mar. 1995
%\addto@pscode{Points aload length 2 div cvi /N ED \psdots@iii}%
\pst@OpenShowPoints
% End modification D.G.
\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
\psk@fillstyle
\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
\pst@newpath
\psk@origin
\psk@swapaxes
\pst@code
end}%
\gdef\pst@code{}}
\def\pst@newpath{newpath }
\def\pst@@killglue{\unskip\ifdim\lastskip>\z@\expandafter\pst@@killglue\fi}
\def\KillGlue{\let\pst@killglue\pst@@killglue}
\def\DontKillGlue{\let\pst@killglue\relax}
\DontKillGlue
\def\solid@star{%
\if@star
\pslinewidth=\z@
\psdoublelinefalse
\def\pslinestyle{none}%
\def\psk@fillstyle{\psfs@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\psk@fillstyle\relax\else
gsave fill grestore
\fi
stroke}%
\pst@repeatarrows
\addto@pscode{grestore}
\ifx\psk@fillstyle\relax\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#1{\addto@pscode{gsave #1 grestore}}%
\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}
newpath
Points aload length 2 div 2 sub cvi /N ED
N 0 ge
{ \ifx\psk@arrowA\@empty
Dot
\else
pop pop
\fi
N { Dot } repeat
\ifx\psk@arrowB\@empty
Dot
\else
pop pop
\fi }
{ N 2 mul { pop } repeat }
ifelse
grestore}}
\def\pscustom{\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}%
\psk@fillstyle
\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}}%
% DG/SR modification begin - May 12, 1997
%\def\translate(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor moveto}}%
\def\translate(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor translate}}%
% DG/SR modification end
\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{\pst@object{stroke}}%
\def\fill{\pst@object{fill}}%
\def\openshadow{\pst@object{openshadow}}%
\def\closedshadow{\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\psk@fillstyle}%
\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@NArray{NArray }
\def\tx@NArray{NArray }
\def\tx@Line{Line }
\def\tx@Arcto{Arcto }
\def\tx@CheckClosed{CheckClosed }
\def\tx@Polygon{Polygon }
\def\psset@gangle#1{\pst@getangle{#1}\psk@gangle}
\psset@gangle{0}
\def\tx@Diamond{Diamond }
\def\psdiamond{\pst@object{psdiamond}}
\def\psdiamond@i(#1){%
\@ifnextchar({\psdiamond@ii(#1)}{\psdiamond@ii(0,0)(#1)}}
\def\psdiamond@ii(#1)(#2){%
\begin@ClosedObj
\pst@getcoor{#1}\pst@tempa
\pst@getcoor{#2}\pst@tempb
\addto@pscode{%
\psline@iii
pop
\psk@dimen
\pst@tempb
\psk@gangle
\pst@tempa
\tx@Diamond}%
\def\pst@linetype{4}%
\end@ClosedObj}
\def\tx@Triangle{Triangle }
\def\pstriangle{\pst@object{pstriangle}}
\def\pstriangle@i(#1){%
\@ifnextchar({\pstriangle@ii(#1)}{\pstriangle@ii(0,0)(#1)}}
\def\pstriangle@ii(#1)(#2){%
\begin@ClosedObj
\pst@getcoor{#1}\pst@tempa
\pst@getcoor{#2}\pst@tempb
\addto@pscode{%
\psline@iii
pop
\psk@dimen
\pst@tempb
\psk@gangle
\pst@tempa
\tx@Triangle}%
\def\pst@linetype{2}%
\end@ClosedObj}
\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{\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{\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{\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{%
\pst@expandafter\pst@getdimnum{#1} 0 {} {}\@nil
\edef\psk@@dotsize{\pst@number\pst@dimg}%
\let\psk@@@dotsize\pst@tempg
\edef\psk@dotsize{%
/DS \psk@@dotsize \psk@@@dotsize CLW mul add 2 div def }}
\psset@dotsize{2pt 2}
\def\psset@dotscale#1{%
\pst@getscale{#1}\psk@dotscale
\ifx\psk@dotscale\@empty
\def\psk@xdotscale{1 }%
\def\psk@ydotscale{1 }%
\else
\let\psk@xdotscale\pst@tempg
\let\psk@ydotscale\pst@temph
\fi}
\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
\ifdim\psk@@dotangle\p@=\z@
\let\psk@dotangle\@empty
\else
\edef\psk@dotangle{\psk@@dotangle rotate }
\fi}
\psset@dotangle{0}
\def\pst@getdotsize{%
\pst@dimg=\psk@@@dotsize\pslinewidth
\advance\pst@dimg\psk@@dotsize\p@
\pst@dimh=\psk@ydotscale\pst@dimg
\pst@dimg=\psk@xdotscale\pst@dimg
\divide\pst@dimh 2
\divide\pst@dimg 2\relax}
\def\psdot{\pst@object{psdot}}
\def\psdot@i{\@ifnextchar({\psdot@ii}{\psdot@ii(\z@,\z@)}}
\def\psdot@ii(#1){%
\begin@SpecialObj
\pst@@getcoor{#1}%
\addto@pscode{%
\psk@dotsize
\@nameuse{psds@\psk@dotstyle}%
\pst@coor Dot}%
\end@SpecialObj}
\def\psdots{\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 { transform floor .5 add exch floor .5 add exch itransform Dot } repeat}
\def\tx@SQ{SQ }
\def\tx@ST{ST }
\def\tx@SP{SP }
\def\pst@gdot#1{/Dot { gsave T \psk@dotangle \psk@dotscale #1 grestore } def }
\@namedef{psds@*}{\pst@gdot{0 0 DS \tx@SD}}
\@namedef{psds@o}{%
/r2 DS CLW sub def
\pst@gdot{0 0 DS \tx@SD \pst@usecolor\psfillcolor 0 0 r2 \tx@SD}}
\@namedef{psds@square*}{%
/r1 DS .886 mul def
\pst@gdot{r1 \tx@SQ}}
\@namedef{psds@square}{%
/r1 DS .886 mul def /r2 r1 CLW sub def
\pst@gdot{r1 \tx@SQ \pst@usecolor\psfillcolor r2 \tx@SQ}}
\@namedef{psds@triangle*}{%
/y1 DS .778 mul neg def /x1 y1 1.732 mul neg def
\pst@gdot{x1 y1 \tx@ST}}
\@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
\pst@gdot{x1 y1 \tx@ST \pst@usecolor\psfillcolor x2 y2 \tx@ST}}
\@namedef{psds@pentagon*}{%
/r1 DS 1.149 mul def
\pst@gdot{r1 \tx@SP}}
\@namedef{psds@pentagon}{%
DS .93 mul dup 1.236 mul /r1 ED CLW sub 1.236 mul /r2 ED
\pst@gdot{r1 \tx@SP \pst@usecolor\psfillcolor r2 \tx@SP}}
\@namedef{psds@+}{%
/DS DS 1.253 mul def
\pst@gdot{DS 0 moveto DS neg 0 L stroke 0 DS moveto 0 DS neg L stroke}}
\@namedef{psds@|}{%
\psk@tbarsize CLW mul add 2 div /DS ED
\pst@gdot{0 DS moveto 0 DS neg L stroke}}
\def\psset@dotstyle#1{%
\@ifundefined{psds@#1}%
{\@pstrickserr{Dot style `#1' not defined}\@eha}%
{\edef\psk@dotstyle{#1}}}
\psset@dotstyle{*}
\def\tx@FontDot{FontDot }
\def\newpsfontdot#1[#2]#3#4{%
\@namedef{psds@#1}{%
/#3 \psk@@dotangle [#2] \tx@FontDot
% DG/SR modification begin - July 9, 1997
%/Dot { moveto #4 show } bind def }}
/Dot { moveto #4 \psk@dotscale show } bind def }}
% DG/SR modification end
\def\newpsfontdotH#1[#2]#3#4#5{%
\@namedef{psds@#1}{%
/#3 \psk@@dotangle [#2] \tx@FontDot
/Dot {
moveto
\iftrue
gsave \pst@usecolor\psfillcolor #5 show grestore
\fi
% DG/SR modification begin - July 9, 1997
%#4 show
#4 \psk@dotscale show
% DG/SR modification end
} bind def }}
\pstheader{pst-dots.pro}
\newpsfontdot{*}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(b)}
\newpsfontdotH{o}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(c)}{(b)}
\newpsfontdotH{Bo}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(C)}{(b)}
\newpsfontdotH{triangle}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(t)}{(u)}
\newpsfontdotH{Btriangle}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(T)}{(u)}
\newpsfontdot{triangle*}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(u)}
\newpsfontdotH{square}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(s)}{(r)}
\newpsfontdotH{Bsquare}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(S)}{(r)}
\newpsfontdot{square*}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(r)}
\newpsfontdotH{pentagon}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(p)}{(q)}
\newpsfontdotH{Bpentagon}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(P)}{(q)}
\newpsfontdot{pentagon*}%
[1.0 0.0 0.0 1.0 0.0 0.0]{PSTricksDotFont}{(q)}
% Modification Denis GIROU (CNRS/IDRIS - France) <Denis.Girou@idris.fr> - 18 Mar. 1997
%\newpsfontdot{diamond*}%
%[1.9 0.0 0.0 1.9 -0.4598 -0.70775]{Symbol}{<E0>}
%\newpsfontdot{diamond}%
%[2.3 0.0 0.0 2.3 -0.8533 -0.5336]{Symbol}{<A8>}
\newpsfontdot{diamond}%
[1.9 0.0 0.0 1.9 -0.4598 -0.70775]{Symbol}{<E0>}
\newpsfontdot{diamond*}%
[2.3 0.0 0.0 2.3 -0.8533 -0.5336]{Symbol}{<A8>}
\newpsfontdot{oplus}%
[1.44928 0.0 0.0 1.44928 -0.562319 -0.478261]{Symbol}{<C5>}
\newpsfontdot{otimes}%
[1.44928 0.0 0.0 1.44928 -0.562319 -0.475362]{Symbol}{<C4>}
\newpsfontdot{x}%
[1.8 0.0 0.0 1.8 -0.495 -0.4788]{Symbol}{<B4>}
\newpsfontdot{+}%
[2.3 0.0 0.0 2.3 -0.6486 -0.5819]{Times-Roman}{<2B>}
\newpsfontdot{asterisk}%
[2.43309 0.0 0.0 2.43309 -0.609489 -1.14477]{Times-Roman}{<2A>}
\newpsfontdot{B+}%
[2.3 0.0 0.0 2.3 -0.6555 -0.5819]{Times-Bold}{<2B>}
\newpsfontdot{Basterisk}%
[2.29358 0.0 0.0 2.29358 -0.576835 -1.08486]{Times-Bold}{<2A>}
\newpsfontdot{|}%
[1.98413 0.0 0.0 1.98413 -0.258929 -0.712302]{Helvetica}{(|)}
\newpsfontdot{B|}%
[1.98413 0.0 0.0 1.98413 -0.277778 -0.712302]{Helvetica-Bold}{(|)}
\iffalse
\newpsfontdot{*}%
[2.77778 0.0 0.0 2.77778 -0.638889 -0.813889]{Symbol}{<B7>}
\newpsfontdot{o}%
[3.33333 0.0 0.0 3.33333 -0.666667 -1.78167]{Symbol}{<B0>}
\newpsfontdot{Bo}%
[4.69484 0.0 0.0 4.69484 -0.78169 -2.97418]{Times-Bold}{<CA>}
\fi
\newdimen\pslinearc
\def\psset@linearc#1{\pssetlength\pslinearc{#1}}
\psset@linearc{0pt}
\def\psline{\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{\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{\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\tx@BezierNArray{BezierNArray }
\def\tx@OpenBezier{OpenBezier }
\def\tx@ClosedBezier{ClosedBezier }
\def\tx@BezierShowPoints{BezierShowPoints }
\def\psbezier{\pst@object{psbezier}}
\def\psbezier@i{%
\pst@getarrows{%
\begin@OpenObj
\pst@getcoors[\psbezier@ii}}
\def\psbezier@ii{%
\addto@pscode{%
% Modification DG/SR - 28 April 1997 (Pb. inside \pscustom)
%\pst@cp
% Modification DG/SR - end
\ifshowpoints true \else false \fi
\tx@OpenBezier
\ifshowpoints \tx@BezierShowPoints \fi}%
\end@OpenObj}
\def\pscbezier{\pst@object{pscbezier}}
\def\pscbezier@i{%
\begin@ClosedObj
\pst@getcoors[\pscbezier@ii}
\def\pscbezier@ii{%
\addto@pscode{%
\ifshowpoints true \else false \fi
\tx@ClosedBezier
\ifshowpoints \tx@BezierShowPoints \fi}%
\chardef\pst@linetype=1
\end@ClosedObj}
\def\tx@Parab{Parab }
\def\parabola{\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{\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
\let\pst@thisbox\relax
\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
{\pst@thisbox\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
\pst@thisbox
\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
\pst@thisbox
\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{\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{\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[{\clipbox@}{\clipbox@[\z@]}}
% Modification Denis GIROU (CNRS/IDRIS - France) <Denis.Girou@idris.fr> -  3 Apr. 1997
% From paulus@immd5.informatik.uni-erlangen.de (Dietrich Paulus) - 3 Apr 1997
%\def\clipbox@[#1]{\pst@makebox\clipbox@@{#1}}
\def\clipbox@[#1]{\pst@makebox{\clipbox@@{#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{\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{\pst@object{pscirclebox}}
\def\pscirclebox@i{\pst@makebox\pscirclebox@ii}
\def\pscirclebox@ii{%
\begingroup
\pst@useboxpar
\setbox\pst@hbox=\hbox{%
\pst@nodehook
\pscirclebox@iii
\box\pst@hbox}%
\ifpsboxsep \pscirclebox@sep \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\pscirclebox@sep{%
\pst@dimb=\ht\pst@hbox
\advance\pst@dimb\dp\pst@hbox
\divide\pst@dimb 2
\pst@dima=.5\wd\pst@hbox
\pst@pyth\pst@dima\pst@dimb\pst@dimc
\advance\pst@dimc\pslinewidth
\advance\pst@dimc\psframesep
\advance\pst@dimb-\pst@dimc
\setbox\pst@hbox=\hbox to2\pst@dimc{%
\hss
\vbox{\kern-\pst@dimb\box\pst@hbox}%
\hss}%
\advance\pst@dimb-\dp\pst@hbox
\dp\pst@hbox=-\pst@dimb}
\let\pst@nodehook\relax
\def\psCirclebox{\pst@object{psCirclebox}}
\def\psCirclebox@i{\pst@makebox\psCirclebox@ii}
\def\psCirclebox@ii{%
\begingroup
\pst@useboxpar
\pst@dima=\ht\pst@hbox
\advance\pst@dima\dp\pst@hbox
\divide\pst@dima\tw@
\pssetlength\pst@dimb\psk@radius
\setbox\pst@hbox=\hbox{%
\pst@nodehook
\pscircle(.5\wd\pst@hbox,\pst@dima){\pst@dimb}%
\box\pst@hbox}%
\ifpsboxsep \psCirclebox@sep \fi
\leavevmode
\box\pst@hbox
\endgroup}
\def\psCirclebox@sep{%
\pst@dimc=\pst@dimb
\advance\pst@dimb-\pst@dima
\advance\pst@dima\pst@dimc
\setbox\pst@hbox=\hbox to\tw@\pst@dimc{%
\hss
\vrule width \z@ depth \pst@dimb height \pst@dima
\box\pst@hbox
\hss}}%
\def\psovalbox{\pst@object{psovalbox}}
\def\psovalbox@i{\pst@makebox{\psovalbox@ii}}
\def\psovalbox@ii{%
\begingroup
\pst@useboxpar
\psovalbox@iii
\ifpsboxsep\psovalbox@sep\fi
\leavevmode
\box\pst@hbox
\endgroup}
\def\psovalbox@iii{%
\psovalbox@iv
\setbox\pst@hbox=\hbox{%
\begin@ClosedObj
\addto@pscode{%
0 360
\pst@number\pst@dimc CLW 2 div sub
\pst@number\pst@dimd CLW 2 div sub
\pst@number\pst@dima
\pst@number\pst@dimb
\tx@Ellipse
closepath}%
\def\pst@linetype{2}%
\end@ClosedObj
\unhbox\pst@hbox}}
\def\psovalbox@iv{%
\pst@dimc=\pslinewidth\advance\pst@dimc\psframesep
\pst@dimd=\ht\pst@hbox\advance\pst@dimd\dp\pst@hbox
\pst@dima=.5\wd\pst@hbox
\pst@dimb=.5\pst@dimd\advance\pst@dimb-\dp\pst@hbox
\pst@dimd=.707\pst@dimd
\advance\pst@dimd\pst@dimc
\advance\pst@dimc.707\wd\pst@hbox}
\def\psovalbox@sep{%
\setbox\pst@hbox\hbox to 2\pst@dimc{\hss\unhbox\pst@hbox\hss}%
\pst@dimg=\pst@dimd
\advance\pst@dimg-\pst@dimb
\dp\pst@hbox=\pst@dimg
\advance\pst@dimd\pst@dimb
\ht\pst@hbox=\pst@dimd}
\def\psdiabox{\pst@object{psdiabox}}
\def\psdiabox@i{\pst@makebox{\psdiabox@ii}}
\def\psdiabox@ii{%
\begingroup
\pst@useboxpar
\psdiabox@iii
\ifpsboxsep\psdiabox@sep\fi
\leavevmode
\box\pst@hbox
\endgroup}
\def\psdiabox@iv{%
\pst@dimg=.707\pslinewidth
\advance\pst@dimg.707\psframesep
\pst@dima=\wd\pst@hbox
\divide\pst@dima 2
\pst@dimc=\pst@dima
\advance\pst@dimc\pst@dimg
\pst@dimd=\ht\pst@hbox
\advance\pst@dimd\dp\pst@hbox
\divide\pst@dimd 2
\pst@dimb=\pst@dimd
\advance\pst@dimb-\dp\pst@hbox
\advance\pst@dimd\pst@dimg}
\def\psdiabox@iii{%
\psdiabox@iv
\setbox\pst@hbox=\hbox{%
\begin@ClosedObj
\addto@pscode{%
\psline@iii
pop
.5
\pst@number\pst@dimc 2 mul \pst@number\pst@dimd 2 mul
0
\pst@number\pst@dima \pst@number\pst@dimb
\tx@Diamond}%
\def\pst@linetype{4}%
\end@ClosedObj
\box\pst@hbox}}
\def\psdiabox@sep{%
\setbox\pst@hbox\hbox to 4\pst@dimc{\hss\unhbox\pst@hbox\hss}%
\multiply\pst@dimd 2
\advance\pst@dimd\pst@dimb
\ht\pst@hbox\pst@dimd
\advance\pst@dimd-2\pst@dimb
\dp\pst@hbox\pst@dimd}
\def\psset@trimode#1{\pst@expandafter\psset@@trimode{#1}\@empty\@empty\@nil}
\def\psset@@trimode#1#2#3\@nil{%
\let\pst@tempg#1\relax
\ifx\pst@tempg*%
\let\psk@@trimode\@empty
\let\pst@tempg#2\relax
\else
\let\psk@@trimode\relax
\fi
\edef\psk@trimode{%
\ifx R\pst@tempg 1 \else\ifx D\pst@tempg 2
\else\ifx L\pst@tempg 3 \else 0 \fi\fi\fi}}
\psset@trimode{U}
\def\pstribox{\pst@object{pstribox}}
\def\pstribox@i{\pst@makebox{\pstribox@ii}}
\def\pstribox@ii{%
\begingroup
\pst@useboxpar
\pstribox@iii
\ifpsboxsep\pstribox@sep\fi
\leavevmode
\box\pst@hbox
\endgroup}
\def\pstribox@iii{%
\pstribox@iv
\setbox\pst@hbox=\hbox{%
\begin@ClosedObj
\addto@pscode{%
\psline@iii
pop
.5
\pst@number\pst@dimc \pst@number\pst@dimd
\ifodd\psk@trimode exch \fi
\psk@trimode -90 mul
\pst@number\pst@dima \pst@number\pst@dimb
\tx@Triangle}%
\def\pst@linetype{2}%
\end@ClosedObj
\box\pst@hbox}}
\def\pstribox@iv{%
\pst@dimh=\pslinewidth
\advance\pst@dimh\psframesep
\pst@dimg=\ht\pst@hbox
\advance\pst@dimg-\dp\pst@hbox
\divide\pst@dimg 2
\edef\pst@tempa{\number\pst@dimg sp}% For use by nodes.
\ifodd\psk@trimode
\pst@dimb\pst@dimg
\else
\pst@dima=\wd\pst@hbox
\divide\pst@dima 2
\fi
\ifcase\psk@trimode
\pst@dimb=-\dp\pst@hbox
\advance\pst@dimb-\pst@dimh
\or
\pst@dima=-\pst@dimh
\or
\pst@dimb=\ht\pst@hbox
\advance\pst@dimb\pst@dimh
\or
\pst@dima=\wd\pst@hbox
\advance\pst@dima\pst@dimh
\fi
\pst@dimd=\dp\pst@hbox
\advance\pst@dimd\ht\pst@hbox
\ifx\psk@@trimode\relax
\pst@dimc=\wd\pst@hbox
\advance\pst@dimc\ifodd\psk@trimode 1.447\else 1.789\fi\pst@dimh
\multiply\pst@dimc 2
\advance\pst@dimd\ifodd\psk@trimode 1.789\else 1.447\fi\pst@dimh
\multiply\pst@dimd 2
\else
\ifodd\psk@trimode
\advance\pst@dimd 1.1547\wd\pst@hbox
\advance\pst@dimd 3.4641\pst@dimh
\pst@dimc=.866\pst@dimd
\else
\advance\pst@dimd .866\wd\pst@hbox %.866=(sqrt(3)/2)
\advance\pst@dimd 3\pst@dimh
\pst@dimc=1.1547\pst@dimd % 1.1547=(2/sqrt(3))
\fi
\fi}
\def\pstribox@sep{%
\ifodd\psk@trimode
\advance\pst@dimb.5\pst@dimd
\ht\pst@hbox=\pst@dimb
\advance\pst@dimd-\pst@dimb
\dp\pst@hbox=\pst@dimd
\else
\setbox\pst@hbox\hbox to \pst@dimc{\hss\unhbox\pst@hbox\hss}%
\global\pst@dimg=.5\pst@dimc
\fi
\ifcase\psk@trimode
\dp\pst@hbox-\pst@dimb
\advance\pst@dimd\pst@dimb
\ht\pst@hbox\pst@dimd
\or
\pst@dimg=.5\wd\pst@hbox
\global\advance\pst@dimg-\pst@dima
\setbox\pst@hbox\hbox to \pst@dimc{\kern-\pst@dima\box\pst@hbox\hss}%
\or
\ht\pst@hbox\pst@dimb
\advance\pst@dimd-\pst@dimb
\dp\pst@hbox\pst@dimd
\or
\pst@dimg=\pst@dimc
\advance\pst@dimg-\pst@dima
\global\advance\pst@dimg.5\wd\pst@hbox
\setbox\pst@hbox\hbox to \pst@dimc{%
\hss\box\pst@hbox\kern\psframesep\kern\pslinewidth}%
\fi}
\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{\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{\pst@object{psarcn}}
\def\psarcn@i{\def\psarc@type{1}\psarc@i}
\def\pscircle{\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\psset@radius#1{\pst@@getlength{#1}\psk@radius}
\psset@radius{.25cm}
\def\psCircle{\pst@object{psCircle}}
\def\psCircle@i{\@ifnextchar({\psCircle@ii}{\psCircle@ii(0,0)}}
\def\psCircle@ii(#1){\pscircle@do(#1){\psk@radius}}
\def\pswedge{\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{\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 4 -1 roll sub neg 3 1 roll sub
\fi
\pst@tempa
\tx@Ellipse
closepath}%
\def\pst@linetype{2}%
\end@ClosedObj}
\def\multips{\@ifnextchar({\def\pst@par{}\multips@ii}{\multips@i}}
\def\multips@i#1{\def\pst@par{rot=#1}\multips@ii}
\def\multips@ii(#1){\@ifnextchar({\multips@iii(#1)}{\multips@iii(\z@,\z@)(#1)}}
\long\def\multips@iii(#1)(#2)#3#4{%
\begingroup
\use@par
\pst@getcoor{#1}\pst@tempa
\pst@@getcoor{#2}%
\pst@cnta=#3\relax
\init@pscode
\addto@pscode{%
\pst@tempa T \the\pst@cnta\space \pslbrace
gsave \ifx\psk@rot\@empty\else\psk@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{\pst@makebox{\@scalebox{#1}}}
\def\@scalebox#1{%
\begingroup
\pst@getscale{#1}\pst@tempa
\let\pst@tempc\pst@tempg
\let\pst@tempd\pst@temph
\@@scalebox
\endgroup}
\def\@@scalebox{%
\leavevmode
\hbox{%
\ifdim\pst@tempd\p@<\z@
\pst@dimg=\pst@tempd\ht\pst@hbox
\pst@dimh=\pst@tempd\dp\pst@hbox
\dp\pst@hbox=-\pst@dimg
\ht\pst@hbox=-\pst@dimh
\else
\ht\pst@hbox=\pst@tempd\ht\pst@hbox
\dp\pst@hbox=\pst@tempd\dp\pst@hbox
\fi
\pst@dima=\pst@tempc\wd\pst@hbox
\ifdim\pst@dima<\z@\kern-\pst@dima\fi
\pst@Verb{CP CP translate \pst@tempa \tx@NET}%
\hbox to \z@{\box\pst@hbox\hss}%
\pst@Verb{%
CP CP translate
1 \pst@tempc div 1 \pst@tempd div scale
\tx@NET}%
\ifdim\pst@dima>\z@\kern\pst@dima\fi}}
\pslongbox{Scalebox}{\scalebox}
\def\scaleboxto(#1,#2){\pst@makebox{\@scaleboxto(#1,#2)}}
\def\@scaleboxto(#1,#2){%
\begingroup
\pssetlength\pst@dima{#1}%
\pssetlength\pst@dimb{#2}%
\ifdim\pst@dima=\z@\else
\pst@divide{\pst@dima}{\wd\pst@hbox}\pst@tempc
\edef\pst@tempc{\pst@tempc\space}%
\fi
\ifdim\pst@dimb=\z@
\ifdim\pst@dima=\z@
\@pstrickserr{%
\string\scaleboxto\space dimensions cannot both be zero}\@ehpa
\def\pst@tempa{}%
\def\pst@tempc{1 }%
\def\pst@tempd{1 }%
\else
\let\pst@tempd\pst@tempc
\fi
\else
\pst@dimc=\ht\pst@hbox
\advance\pst@dimc\dp\pst@hbox
\pst@divide{\pst@dimb}{\pst@dimc}\pst@tempd
\edef\pst@tempd{\pst@tempd\space}%
\ifdim\pst@dima=\z@ \let\pst@tempc\pst@tempd \fi
\fi
\edef\pst@tempa{\pst@tempc \pst@tempd scale }%
\@@scalebox
\endgroup}
\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@starbox{%
\setbox\pst@hbox\hbox{\psframebox*[boxsep=false]{\unhbox\pst@hbox}}}
\def\pst@@makesmall#1{%
\setbox#1=\hbox to\z@{\hss\vbox to \z@{\vss\box#1\vss}\hss}}
\def\pst@@@makesmall#1{%
\pst@dimh=\psk@xref\wd#1%
\ifx\psk@yref\relax
\pst@dimg=\dp#1%
\else
\pst@dimg=\psk@yref\ht#1%
\advance\pst@dimg\psk@yref\dp#1%
\fi
\setbox#1=\hbox to\z@{%
\kern-\pst@dimh\vbox to\z@{\vss\box#1\kern-\pst@dimg}\hss}}
\def\psset@ref#1{\pst@expandafter\psset@@ref{#1}\@empty,,\@nil}
\def\psset@@ref#1#2,#3,#4\@nil{%
\def\psk@xref{.5}%
\def\psk@yref{.5}%
\let\pst@makesmall\pst@@@makesmall
\ifx\@empty#3\@empty
\@nameuse{getref@#1}%
\@nameuse{getref@#2}%
\else
\pst@checknum{#1#2}\psk@xref
\pst@checknum{#3}\psk@yref
\fi}
\def\getref@c{\let\pst@makesmall\pst@@makesmall}
\def\getref@t{\def\psk@yref{1}}
\def\getref@b{\def\psk@yref{0}}
\def\getref@B{\let\psk@yref\relax}
\def\getref@l{\def\psk@xref{0}}
\def\getref@r{\def\psk@xref{1}}
\psset@ref{c}
\def\psset@rot#1{%
\pst@expandafter{\@ifnextchar*{\psset@@@rot}{\psset@@rot}}{#1}\@nil}
\def\psset@@rot#1\@nil{%
\def\next##1@#1=##2@##3\@nil{%
\ifx\relax##2%
\pst@getangle{#1}\psk@rot
\else
\def\psk@rot{##2}%
\fi}%
\expandafter\next\pst@rottable @#1=\relax @\@nil}
\def\psset@@@rot#1#2\@nil{%
\psset@@rot#2\@nil
\edef\psk@rot{\pst@rotlist \ifx\psk@rot\@empty\else\psk@rot add \fi}}
\def\pst@rotlist{mark RAngle /a ED cleartomark a neg }
\def\pst@rottable{%
@0=%
@U=%
@L=90 %
@D=180 %
@R=-90 %
@N=\pst@rotlist
@W=\pst@rotlist 90 add %
@S=\pst@rotlist 180 add %
@E=\pst@rotlist 90 sub }
\psset@rot{0}
\def\tx@RotBegin{RotBegin }
\def\tx@RotEnd{RotEnd }
\def\pst@rotate#1#2{%
\ifx#1\@empty\else
\setbox#2=\hbox{\pst@Verb{#1 \tx@RotBegin}\box#2\pst@Verb{\tx@RotEnd}}%
\fi}
\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\rput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\rput@i}{\rput@ii}}}
\def\rput@i[#1]{\addto@par{ref={#1}}\rput@ii}
\def\rput@ii{\@ifnextchar({\rput@iv}{\rput@iii}}
\def\rput@iii#1{\addto@par{rot={#1}}\@ifnextchar({\rput@iv}{\rput@iv(\z@,\z@)}}
\def\rput@iv(#1){\pst@killglue\pst@makebox{\rput@v{#1}}}
\def\rput@v#1{%
\begingroup
\use@par
\if@star\pst@starbox\fi
\pst@makesmall\pst@hbox
\pst@rotate\psk@rot\pst@hbox
\psput@{#1}\pst@hbox
\endgroup
\ignorespaces}
\def\multirput{%
\def\pst@par{}%
\pst@ifstar{\@ifnextchar[{\multirput@i}{\multirput@ii}}}
\def\multirput@i[#1]{\addto@par{ref={#1}}\multirput@ii}
\def\multirput@ii{\@ifnextchar({\multirput@iv}{\multirput@iii}}
\def\multirput@iii#1{\addto@par{rot={#1}}\multirput@iv}
\def\multirput@iv(#1){%
\@ifnextchar({\multirput@v(#1)}{\multirput@v(\z@,\z@)(#1)}}
\def\multirput@v(#1,#2)(#3,#4)#5{%
\pst@makebox{\multirput@vi(#1,#2)(#3,#4){#5}}}
\def\multirput@vi(#1,#2)(#3,#4)#5{%
\begingroup
\use@par
\if@star\pst@starbox\fi
\pst@makesmall\pst@hbox
\pst@rotate\psk@rot\pst@hbox
\pssetxlength\pst@dima{#1}%
\pssetylength\pst@dimb{#2}%
\pssetxlength\pst@dimc{#3}%
\pssetylength\pst@dimd{#4}%
\pst@cntg=#5\relax
\pst@cnth=\@ne
\leavevmode
\loop
\vbox to \z@{%
\vss
\hbox to \z@{\kern\pst@dima\copy\pst@hbox\hss}%
\vskip\pst@dimb}%
\ifnum\pst@cntg>\pst@cnth
\advance\pst@dima\pst@dimc
\advance\pst@dimb\pst@dimd
\advance\pst@cnth\@ne
\repeat
\endgroup
\ignorespaces}
\newif\if@fixedradius
\def\cput{\pst@object{cput}}
\def\cput@i{\@fixedradiusfalse\cput@ii}
\def\cput@ii{\pst@killglue\@ifnextchar({\cput@iv}{\cput@iii}}
\def\cput@iii#1{%
\addto@par{rot={#1}}%
\@ifnextchar({\cput@iv}{\cput@iv(\z@,\z@)}}
\def\cput@iv(#1){\pst@makebox{\cput@v{#1}}}
\def\cput@v#1{%
\begingroup
\use@par
\setbox\pst@hbox=\hbox{%
\psboxsepfalse
\if@fixedradius\psCirclebox@ii\else\pscirclebox@ii\fi}%
\pst@@makesmall\pst@hbox
\pst@rotate\psk@rot\pst@hbox
\psput@{#1}\pst@hbox
\endgroup
\ignorespaces}
\def\Cput{\pst@object{Cput}}
\def\Cput@i{\@fixedradiustrue\cput@ii}
\newdimen\pslabelsep
\def\psset@labelsep#1{\pssetlength\pslabelsep{#1}}
\psset@labelsep{5pt}
\def\psset@refangle#1{\pst@expandafter\psset@@refangle{#1}\@nil}
\def\psset@@refangle#1\@nil{%
\def\next##1@#1=##2"##3@##4\@nil{%
\ifx\relax##2%
\pst@getangle{#1}\psk@refangle
\def\psk@uputref{}%
\else
\def\psk@refangle{##2 }%
\def\psk@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}
\psset@refangle{0}
\def\uput{\def\pst@par{}\@ifnextchar[{\uput@ii}{\uput@i}}
\def\uput@i#1{\addto@par{labelsep=#1}\uput@ii}
\def\uput@ii[#1]{%
\addto@par{refangle={#1}}%
\@ifnextchar({\uput@iv}{\uput@iii}}
\def\uput@iii#1{%
\addto@par{rot={#1}}%
\@ifnextchar({\uput@iv}{\uput@iv(\z@,\z@)}}
\def\uput@iv(#1){\pst@killglue\pst@makebox{\uput@v{#1}}}
\def\uput@v#1{%
\begingroup
\use@par
\if@star\pst@starbox\fi
\uput@vi
\psput@{#1}\pst@hbox
\endgroup
\ignorespaces}
\def\uput@vi{%
\ifx\psk@uputref\@empty
\uput@vii\tx@UUput{}%
\else
\ifx\psk@rot\@empty
\expandafter\uput@viii\psk@uputref
\else
\uput@vii\tx@UUput{}%
\fi
\fi}
\def\uput@vii#1#2{%
\edef\pst@coor{%
\pst@number\pslabelsep
#2%
\pst@number{\wd\pst@hbox}%
\pst@number{\ht\pst@hbox}%
\pst@number{\dp\pst@hbox}%
\psk@refangle\space \ifx\psk@rot\@empty\else\psk@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\psk@rot\@empty\else\pst@rotate\psk@rot\pst@hbox\fi}
\def\uput@viii#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\Rput{\def\pst@par{}\pst@ifstar{\@ifnextchar[{\Rput@ii}{\Rput@i}}}
\def\Rput@i#1{\addto@par{labelsep=#1}\Rput@ii}
\def\Rput@ii[#1]{\addto@par{ref={#1}}\@ifnextchar({\Rput@iv}{\Rput@iii}}
\def\Rput@iii#1{\addto@par{rot={#1}}\@ifnextchar({\Rput@iv}{\Rput@iv(\z@,\z@)}}
\def\Rput@iv(#1){\pst@killglue\pst@makebox{\Rput@v{#1}}}
\def\Rput@v#1{%
\begingroup
\use@par
\if@star\pst@starbox\fi
\Rput@vi
\pst@makesmall\pst@hbox
\pst@rotate\psk@rot\pst@hbox
\psput@{#1}\pst@hbox
\endgroup
\ignorespaces}
\def\Rput@vi{%
\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\oldpsput{%
\def\pst@par{}\pst@ifstar{\@ifnextchar[{\oldpsput@i}{\oldpsput@ii}}}
\def\oldpsput@i[#1]{\addto@par{ref={#1}}\oldpsput@ii}
\def\oldpsput@ii{\@ifnextchar<{\oldpsput@iii}{\oldpsput@iv}}
\def\oldpsput@iii<#1>{\rput@iii{#1}}
\def\OldPsput{\let\psput\oldpsput}
\def\NewPsput{\let\psput\rput}
\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}%
\ifdim\pst@dima>\pst@dimc
\pst@dimg=\pst@dima
\pst@dima=\pst@dimc
\pst@dimc=\pst@dimg
\fi
\ifdim\pst@dimb>\pst@dimd
\pst@dimg=\pst@dimb
\pst@dimb=\pst@dimd
\pst@dimd=\pst@dimg
\fi
\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 }
\def\tx@InitOL{InitOL }
\def\pst@initoverlay#1{\pst@Verb{\tx@InitOL /TheOL (#1) def}}
\def\AltOverlayMode{%
\def\pst@initoverlay##1{%
\pst@Verb{%
\tx@InitOL
/Visible { initclip } def
/Invisible {
CP newpath OLUnit itransform moveto clip newpath moveto
} def
/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{%
\global\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}%
\ignorespaces}
\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
%
\input pstricks.bug
\endinput
%%
%% END: pstricks.tex


math0204007.extracted_bib
\begin{thebibliography}{10}

\bibitem{Barnette:inequalities}
David Barnette, \emph{Inequalities for $f$-vectors of $4$-polytopes}, Israel J.
  Math. \textbf{11} (1972), 284--291.

\bibitem{Bayer:extended}
Margaret~M. Bayer, \emph{The extended $f$-vectors of $4$-polytopes}, J.
  Combinatorial Theory Ser. A \textbf{44} (1987), no.~1, 141--151.

\bibitem{BJ:dehn}
Margaret~M. Bayer and Louis~J. Billera, \emph{Generalized {Dehn-Sommerville}
  relations for polytopes, spheres and {Eulerian} partially ordered sets},
  Inventiones Math. \textbf{79} (1985), no.~1, 143--157.

\bibitem{BL:sufficiency}
Louis~J. Billera and Carl~W. Lee, \emph{A proof of the sufficiency of
  {M}c{M}ullen's conditions for $f$-vectors of simplicial convex polytopes}, J.
  Combin. Theory Ser. A \textbf{31} (1981), no.~3, 237--255.

\bibitem{Bollobas:extremal}
B\'ela Bollob\'as, \emph{Extremal graph theory}, Handbook of Combinatorics
  (R.~Graham, M.~Gr\"otschel, and L.~Lov\'asz, eds.), North-Holland/Elsevier,
  Amsterdam, 1995, pp.~1231--1292.

\bibitem{Braden:glued}
Tom Braden, \emph{A glued hypersimplex}, 1997, Personal communication.

\bibitem{CS:splag}
John~H. Conway and Neil J.~A. Sloane, \emph{Sphere packings, lattices and
  groups}, 3rd ed., Grundlehren der mathematischen {Wissenschaften}, vol. 290,
  Springer-Verlag, New York, 1993.

\bibitem{Coxeter:regpoly}
Harold Scott~MacDonald Coxeter, \emph{Regular polytopes}, 2nd ed., Macmillan,
  New York, 1963, Corrected reprint, Dover, New York 1973.

\bibitem{ES:hyperplane}
Herbert Edelsbrunner and Micha Sharir, \emph{A hyperplane incidence problem
  with applications to counting distances}, Applied geometry and discrete
  mathematics: {The Victor Klee Festschrift} (P.~Gritzman and B.~Sturmfels,
  eds.), DIMACS Series in Discrete Mathematics and Theoretical Computer
  Science, vol.~4, Amer. Math. Soc., Providence, RI, 1991, pp.~253--263.

\bibitem{Erdos:primzahlen}
Paul Erd\H{o}s, \emph{{\"Uber} die {Primzahlen} gewisser arithmetischer
  {Reihen}}, Math. Z. \textbf{39} (1935), 473--491.

\bibitem{Kuperberg:saturated}
G\'abor {Fejes T\'oth}, Greg Kuperberg, and W{\l}odzimierz Kuperberg,
  \emph{Highly saturated packings and reduced coverings}, Monatsh. Math.
  \textbf{125} (1998), no.~2, 127--145.

\bibitem{Fulton:gtm}
William Fulton, \emph{Algebraic topology. {A} first course}, Graduate Texts in
  Mathematics, vol. 153, Springer-Verlag, New York, 1995.

\bibitem{Grunbaum:convex}
Branko Gr\"unbaum, \emph{Convex polytopes}, Interscience, London, 1967.

\bibitem{HZ:census}
Andrea H\"oppner and G\"unter~M. Ziegler, \emph{A census of flag-vectors of
  $4$-polytopes}, Polytopes --- combinatorics and computation (G.~Kalai and
  G.M. Ziegler, eds.), DMV Seminars, vol.~29, Birkh\"auser-Verlag, Basel, 2000,
  pp.~105--110.

\bibitem{Iverson:hyperbolic}
Birger Iversen, \emph{Hyperbolic geometry}, London Math. Soc. Student Texts,
  vol.~25, Cambridge University Press, Cambridge, 1992.

\bibitem{JZ:cubical}
Michael Joswig and G\"unter~M. Ziegler, \emph{Neighborly cubical polytopes},
  Discrete Comput. Geom. \textbf{24} (2000), no.~2-3, 325--344,
  \mbox{arXiv:math.CO/9812033}.

\bibitem{KST:problem}
Tam\'as K\H{o}v\'ari, Vera~T. S\'os, and P\'al Tur\'an, \emph{On a problem of
  {K. Zarankiewicz}}, Colloq. Math. \textbf{3} (1954), 50--57.

\bibitem{Kuperberg:kissing}
Greg Kuperberg and Oded Schramm, \emph{Average kissing numbers for
  non-congruent sphere packings}, Math. Res. Lett. \textbf{1} (1994), no.~3,
  339--344, \mbox{arXiv:math.MG/9405218}.

\bibitem{Malcev:faithful}
A.~I. Mal'cev, \emph{On the faithful representation of infinite groups by
  matrices}, Amer. Math. Soc. Transl. (2) \textbf{45} (1965), 1--18.

\bibitem{Malkevitch:tiling}
Joseph Malkevitch, \emph{Tiling convex polygons with equilateral triangles and
  squares}, Discrete Geometry and Convexity (J.~E. Goodman, E.~Lutwak,
  J.~Malkevitch, and R.~Pollack, eds.), Ann. New York Acad. Sci., vol. 440, New
  York Academy of Sciences, 1985, pp.~299--303.

\bibitem{McMullen:simplicial}
Peter McMullen, \emph{The numbers of faces of simplicial polytopes}, Israel J.
  Math. \textbf{9} (1971), 559--570.

\bibitem{Munkres:algtop}
James~R. Munkres, \emph{Elements of algebraic topology}, Addison-Wesley, Menlo
  Park, CA, 1984.

\bibitem{PA:combin}
J\'anos Pach and Pankaj~K. Agarwal, \emph{Combinatorial geometry}, J. Wiley and
  Sons, New York, 1995.

\bibitem{Schulte:steinitz}
Egon Schulte, \emph{Analogues of {Steinitz's} theorem about
  non-in\-scrib\-a\-ble polytopes}, Intuitive geometry (Si\'ofok 1985)
  (Amsterdam), Colloquia Soc. J\'anos Bolyai, vol.~48, North Holland, 1987,
  pp.~503--516.

\bibitem{Silverman:gtm}
Joseph~H. Silverman, \emph{The arithmetic of elliptic curves}, Graduate Texts
  in Mathematics, vol. 106, Springer-Verlag, New York, 1986.

\bibitem{Stanley:simplicial}
Richard~P. Stanley, \emph{The number of faces of a simplicial convex polytope},
  Adv. in Math. \textbf{35} (1980), no.~3, 236--238.

\bibitem{Stanley:eulerian}
\bysame, \emph{A survey of {Eulerian} posets}, Polytopes: abstract, convex and
  computational (Scarborough, ON, 1993), NATO Adv. Sci. Inst. Ser. C Math.
  Phys. Sci., vol. 440, Kluwer Acad. Publ., Dordrecht, 1994, pp.~301--333.

\bibitem{Steinitz:eulerschen}
Ernst Steinitz, \emph{{\"Uber} die {Eulerschen Polyederrelationen}}, Archiv
  f\"ur Mathematik und Physik \textbf{11} (1906), 86--88.

\bibitem{Stillwell:gtm}
John Stillwell, \emph{Classical topology and combinatorial group theory}, 2nd
  ed., Graduate Texts in Mathematics, no.~72, Springer-Verlag, 1993.

\bibitem{Thurston:geometry}
William~P. Thurston, \emph{Three-dimensional geometry and topology}, vol.~I,
  Princeton University Press, Princeton, NJ, 1997.

\bibitem{VY:surfaces}
Gert Vegter and Chee~K. Yap, \emph{Computational complexity of combinatorial
  surfaces}, Proc. 6th ACM Symp. Comp. Geom., ACM Press, 1990, pp.~102--111.

\bibitem{Vinberg:reflection}
Ernest~B. Vinberg, \emph{Hyperbolic reflection groups}, Russian Math. Surveys
  \textbf{40} (1985), 31--75.

\bibitem{Waite:combining}
William Waite, \emph{Combining squares and triangles}, Cubism for Fun
  \textbf{53} (2000), 18--22.

\bibitem{Walkup:lower}
David~W. Walkup, \emph{The lower bound conjecture for $3$- and $4$-manifolds},
  Acta Math. \textbf{125} (1970), 75--107.

\bibitem{Ziegler:gtm}
G\"unter~M. Ziegler, \emph{Lectures on polytopes}, Graduate Texts in
  Mathematics, vol. 152, Springer-Verlag, New York, 1995, Revised edition,
  1998.

\end{thebibliography}