summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/pstricks/code/pstricks.doc
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/generic/pstricks/code/pstricks.doc')
-rw-r--r--Master/texmf-dist/doc/generic/pstricks/code/pstricks.doc4739
1 files changed, 0 insertions, 4739 deletions
diff --git a/Master/texmf-dist/doc/generic/pstricks/code/pstricks.doc b/Master/texmf-dist/doc/generic/pstricks/code/pstricks.doc
deleted file mode 100644
index e7cf2b591c9..00000000000
--- a/Master/texmf-dist/doc/generic/pstricks/code/pstricks.doc
+++ /dev/null
@@ -1,4739 +0,0 @@
-%% BEGIN pstricks.doc
-\def\fileversion{0.93a}
-\def\filedate{93/03/12}
-%
-% File `pstricks.doc': 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.
-%%
-% **************************************************************************
-% This is `pstricks.doc', which contains the documented code for the PSTricks
-% package. See the PSTricks read-me file for information on how to
-% use this file.
-% **************************************************************************
-%
-% \EndDocPreamble
-%
-% \CheckSum{5048}
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-%
-% \section{Disclaimers, Guidelines and Other Comments}
-%
-% \paragraph*{Disclaimer}
-% These macros are extensive and were written hurriedly. Only modest attempts
-% have been made to clean up and optimize the code. The internals may change
-% substantially until version 1.0 comes up.
-%
-% \paragraph*{PostScript Guidelines}
-% The following guidelines were followed for macros using PostScript
-% "\special"'s:
-% \begin{enumerate}
-% \item Almost no "gsave" and "grestore" commands are used (reducing the
-% likelihood of conflicts with dvi-to-ps drivers or an unmatched "gsave" or
-% "grestore" ending up on a page).
-% \item Most end-user macros (those without "@") have error-checking so that
-% bad arguments or other misuse will not generate PostScript errors.
-% \end{enumerate}
-%
-% \iffalse
-% \paragraph*{Prefixes}
-% (This list is not complete.) Here are the conventions on prefixes, such as
-% the "pst" is "\pst@Verb":
-% \begin{center}
-% \begin{tabular}{ll}
-% {\em Prefix} & {\em Use}\\
-% "pst" & This and that.\\
-% "psk" & Graphics parameters ("k"={\em key}).\\
-% "psset" & Macros that set graphics parameters.\\
-% "psls" & Line styles.\\
-% "psfs" & Fill styles.\\
-% "psas" & Arrow styles.\\
-% "pscs" & Custom styles.\\
-% \end{tabular}
-% \end{center}
-% \fi
-%
-% \paragraph*{Macros}
-% A ``macro'' means any command sequence that is documented in this with a
-% heading entry. Macros with "@" are internal, and others are part of the user
-% interface. Commands that are not in the heading preceding their definition
-% are internal commands of a macro, and are not meant to be used directly by
-% other macros.
-%
-% \paragraph*{Local and global variables}
-% There are various classes of scratch registers and commands:
-% \begin{description}
-% \item[Global] These can be changed using "\global", etc.
-% \begin{LVerbatim}
-% \pst@tempg
-% \pst@temph
-% \pst@dimg
-% \pst@dimh
-% \pst@cntg
-% \pst@cnth
-% \pst@boxg
-% \end{LVerbatim}
-%
-% \item[Local-I] These cannot be changed with "\global", but otherwise there
-% are no restrictions.
-% \begin{LVerbatim}
-% \next
-% \@tempa
-% \end{LVerbatim}
-%
-% \item[Local-I]
-% Changes to these must be local to the macro in which they occur (be
-% grouping).
-% \begin{LVerbatim}
-% \pst@tempa
-% \pst@tempb
-% \pst@tempc
-% \pst@tempd
-% \end{LVerbatim}
-%
-% \item[Local-II] Changes to these must be local to the macro in which they
-% occur, and it must be possible to use these as arguments of macros.
-% \begin{LVerbatim}
-% \pst@dima
-% \pst@dimb
-% \pst@dimc
-% \pst@dimd
-% \if@pst
-% \end{LVerbatim}
-% There is one exception. When using these in coordinates that are processed
-% directly as Cartesian coordinates rather than with "\pst@getcoor", they must
-% be used in this order:
-% \begin{LVerbatim}
-% (\pst@dima,\pst@dimb)(\pst@dimc,\pst@dimd)
-% \end{LVerbatim}
-%
-% \item[Shared] These are used to share information between macros. Their
-% value may be set by one macro and then used by another. Use with care. Do
-% not set with "\global".
-% \begin{quote}
-% \begin{tabular}{ll}
-% \em command & \em usage\\
-% "\pst@hbox" & Box created and manipulated in HR-box macros.\\
-% "\pst@coor" & PostScript code for a coordinate.\\
-% "\pst@angle" & PostScript code for an angle.\\
-% "\pst@rot" & PostScript code for a rotation angle.\\
-% "\if@star" & This is a flag to keep track of optional "*".
-% \end{tabular}
-% \end{quote}
-%
-% \end{description}
-%
-% \paragraph*{Plain \TeX\ commands}
-% The commands
-% \begin{LVerbatim}
-% \newbox
-% \newcount
-% \newdimen
-% \newif
-% \loop ... \repeat ... \fi
-% \z@
-% \sixt@@n
-%\end{LVerbatim}
-% are defined in "plain.tex" are part of most macro packages. PSTricks assumes
-% that they are defined. Other than these, PSTricks only makes use of \TeX\
-% primitives.
-%
-% \paragraph*{Dividing the file}
-%
-% {\bf\em Breaking up the file}\hskip 1em "pstricks.tex" can be broken up into
-% the following components:
-% \begin{description}
-% \item[Basics] (Including color and simple rotation.) Sections \ref{Prelim},
-% \ref{Config}, \ref{Header}, \ref{Errors}, \ref{Colors}, \ref{Colortab},
-% \ref{Rotation:simple} and \ref{Config:revisited}.
-% \item[Graphics] Sections \ref{Parameters}, \ref{Objects}, \ref{Linestyles},
-% \ref{Arrowheads}, \ref{Lines}, \ref{Grids}, \ref{Fillstyles}, \ref{Frames},
-% \ref{Frameboxes} and \ref{Circles}. Requires also {\bf Basics}.
-% \item[Rotation] (Including picture environment.) Sections \ref{Arithmetic},
-% \ref{Rotation:prelim}, \ref{Rotation:main} and \ref{Pictures}. Requires also
-% {\bf Basics}.
-% \end{description}
-%
-
-% \section{Preliminaries\label{Prelim}}
-%
-% Check whether file has been loaded already.
-% \begin{macrocode}
-\csname PSTricksLoaded\endcsname
-\let\PSTricksLoaded\endinput
-% \end{macrocode}
-%
-% Take care of the catcode of "@":
-% \begin{macrocode}
-\edef\PstAtCode{\the\catcode`\@}
-\catcode`\@=11\relax
-% \end{macrocode}
-%
-% Here are some hacks borrowed from \LaTeX{}, which are defined if \LaTeX{} is
-% not being used.
-%
-% \begin{macrocode}
-\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
-% \end{macrocode}
-%
-% Announce that the file is being loaded:
-% \begin{macrocode}
-\typeout{`PSTricks' v\fileversion\space\space <\filedate> (tvz)}
-% \end{macrocode}
-%
-%
-% \section{Error messages}
-%
-% \begin{macro}{\@pstrickserr}
-% "\@pstrickserr" is analogous to "\@latexerr".
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@ehpa,\@ehpb,\@ehpc}
-% Here are some extra "\errhelp" message:
-% \begin{macrocode}
-\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.}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@misplaced}
-% \begin{macrocode}
-\def\pst@misplaced#1{\@pstrickserr{Misplaced \string#1 command}\@ehpb}
-% \end{macrocode}
-% \end{macro}
-%
-% \section{Scratch registers}
-%
-% \begin{macrocode}
-\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
-% \end{macrocode}
-%
-%
-% \section{Useful hacks}
-%
-% \begin{macro}{\pst@ifstar,\if@star}
-% \begin{macrocode}
-\newif\if@star
-\def\pst@ifstar#1{%
- \@ifnextchar*{\@startrue\def\next*{#1}\next}{\@starfalse#1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@expandafter}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Arithmetic}
-%
-% \begin{macro}{\pst@dimtonum,\pst@@dimtonum}
-% This macro strips the value of "#1", a dimension register, of the "pt", and
-% assigns the result to "#2", a command sequence. This is used for arithmetic
-% and for converting \TeX\ dimensions to PostScript.
-% \begin{macrocode}
-\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}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@pyth}
-% This is a piecewise-linear approximation to $("#1"^2+"#2"^2)^(1/2)$. The
-% answer is assigned to "#3". All arguments should be dimension registers.
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@divide}
-% This computes "#3"="#1"/"#2" reasonably quickly. "#1" and "#2" should be
-% dimensions, and "#3" should be a command sequence.
-% \begin{macrocode}
-\def\pst@divide#1#2#3{%
- \begingroup
- \pst@dimg=#1\relax\pst@dimh=#2\relax
- \pst@cnta=\pst@dimg
- \pst@cntb=1073741824
- \pst@cntc=65536
- \def\pst@tempa{\fi\ifnum}%
- \loop\ifnum\pst@cnta<\pst@cntb
- \pst@tempa\pst@cntc>\@ne
- \multiply\pst@cnta2\divide\pst@cntc2
- \repeat
- \divide\pst@dimh\pst@cntc
- \divide\pst@cnta\pst@dimh
- \global\pst@dimg\number\pst@cnta sp
- \endgroup
- \pst@dimtonum\pst@dimg#3}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Configuration file\label{Config}}
-%
-% \begin{macro}{\pst@configerr}
-% \begin{macrocode}
-\def\pst@configerr#1{%
- \@pstrickserr{\string#1 not defined in pstricks.con}\@ehpc}
-% \end{macrocode}
-% \end{macro}
-%
-% % \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
-% \end{macrocode}
-%
-% \begin{macro}{\PSTricksOff}
-% \begin{macrocode}
-\newif\ifPSTricks
-\PSTrickstrue
-\def\PSTricksOff{%
- \def\pstheader##1{}%
- \def\pstverb##1{}%
- \def\pstVerb##1{}%
- \PSTricksfalse}
-% \end{macrocode}
-% \end{macro}
-%
-% \section{PostScript header file\label{Header}}
-%
-% \begin{macro}{\pst@def,\pst@ATH,\pst@useheader}
-% There are three ways to use PSTricks:
-% \begin{enumerate}
-% \item Use "pstricks.doc" directly. No header file is used.
-% \item Use "\pst-make.tex" to generate a stripped input file for use without
-% a header.
-% \item Use "\pst-make.tex" to generate a header and a stripped input file for
-% use with the header.
-% \end{enumerate}
-% PSTricks has been optimized for use with a header file (and the difference
-% is speed and memory is very significant), but the flexible system described
-% above makes it easier to maintain the code and allows one to use PSTricks
-% with a DVI-to-PS driver that does not support header files.
-%
-% The following commands should be used in this ".doc" file for PostScript
-% macros and other goodies related to the header file. Their behavior for each
-% of the three cases list above is given below. These commands should always
-% come {\em at the beginning of the line}, and should not inside conditionals.
-%
-% \begin{itemize}
-%
-% \item "\pst@def{foo}<bar>"
-% \begin{enumerate}
-% \item "\tx@foo" is defined to be "bar".
-% \item Writes
-% \begin{LVerbatim}
-% \def\tx@foo{bar}
-% \end{LVerbatim}
-% to "pstricks.tex".
-% \item Writes
-% \begin{LVerbatim}
-% /foo { bar } def
-% \end{LVerbatim}
-% to "pstricks.pro" and
-% \begin{LVerbatim}
-% \def\tx@foo{foo}
-% \end{LVerbatim}
-% to "pstricks.tex".
-% \end{enumerate}
-%
-% \item "\pst@ATH<foo>"
-% \begin{enumerate}
-% \item Gobbles "foo".
-% \item Ignores line.
-% \item Writes "foo" to "pstricks.pro".
-% \end{enumerate}
-% Note: "\pst@ATH" must come at the beginning of the line.
-%
-% \item "\ifx\pst@useheader\iftrue foo \else bar \fi"
-% \begin{enumerate}
-% \item Ignores "foo" and includes "bar".
-% \item Ignores "foo" and processes "bar".
-% \item Processes "foo" and ignores "bar".
-% \end{enumerate}
-% Note: "\ifx\pst@useheader\iftrue", "\else" and "\fi" must each be on their
-% own line.
-%
-% \end{itemize}
-%
-% "pst@make.tex" can be used to process other files at well, in the right
-% order.
-%
-% \begin{macrocode}
-\@ifundefined{pst@def}{\def\pst@def#1<#2>{\@namedef{tx@#1}{#2 }}}{}
-\@ifundefined{pst@ATH}{\def\pst@ATH<#1>{}}{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@dict}
-% The PostScript dictionary "tx@Dict" is set up in the header file, if one is
-% used. Otherwise, it is set up with each procedure that uses the dictionary,
-% if it is not currently defined.
-% \begin{macrocode}
-\pst@ATH<\% Version \fileversion, \filedate.>
-\pst@ATH<\% For use with \pstdriver.>
-\pst@ATH</tx@Dict 200 dict def tx@Dict begin>
-\pst@ATH</ADict 25 dict def>
-\pst@ATH</CM { matrix currentmatrix } bind def>
-\pst@ATH</SLW /setlinewidth load def>
-\pst@ATH</CLW /currentlinewidth load def>
-\pst@ATH</CP /currentpoint load def>
-\pst@ATH</ED { exch def } bind def>
-\pst@ATH</L /lineto load def>
-\pst@ATH</T /translate load def>
-\ifx\pst@useheader\iftrue
- \pstheader{pstricks.pro}
- \def\pst@dict{tx@Dict begin }
- \def\pst@theheaders{pstricks.pro}
-\else
- \def\pst@dict{%
- /tx@Dict where
- { pop tx@Dict begin}
- { userdict begin
- /tx@Dict 200 dict def
- end
- tx@Dict begin
- /ADict 25 dict def
- /CM { matrix currentmatrix } bind def
- /SLW /setlinewidth load def
- /CLW /currentlinewidth load def
- /CP /currentpoint load def
- /ED { exch def } bind def
- /L /lineto load def }
- ifelse }
- \def\pst@theheaders{}%
-\fi
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@Verb}
-% \begin{macrocode}
-\def\pst@Verb#1{\pstVerb{\pst@dict #1 end}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{PostScript hacks}
-%
-%
-% \begin{macro}{\tx@Atan,\tx@Div}
-% These are variants of "atan", and "div", that recover when result is not
-% defined.
-% \begin{macrocode}
-\pst@def{Atan}</atan load stopped { pop pop 0 } if>
-\pst@def{Div}<dup 0 eq { pop } { div } ifelse>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@NET}
-% \begin{macrocode}
-\pst@def{NET}<neg exch neg exch T>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@Pyth}
-% $A$ $B$ "Pyth" $(A^2 + B^2)^{1/2}$
-% \begin{macrocode}
-\pst@def{Pyth}<dup mul exch dup mul add sqrt>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@PtoC}
-% Polar to Cartesian:
-% \begin{LVerbatim}
-% <r> <a> PtoC <x> <y>
-% \end{LVerbatim}
-% \begin{macrocode}
-\pst@def{PtoC}<2 copy cos mul 3 1 roll sin mul>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@PathLength}
-% "PathLength" is taken from the Blue Book. It leaves on the stack the length
-% of the current path.
-% \begin{macrocode}
-\pst@def{PathLength@}<%
- /z z y y1 sub x x1 sub \tx@Pyth add def
- /y1 y def /x1 x def>
-\pst@def{PathLength}<%
- flattenpath /z 0 def
- { /y1 ED /x1 ED /y2 y1 def /x2 x1 def } % moveto
- { /y ED /x ED \tx@PathLength@ } % lineto
- {} % curveto; ignore because of flattenpath.
- { /y y2 def /x x2 def \tx@PathLength@ } % closepath
- pathforall z>
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Converting \TeX\ things to PostScript}
-%
-% \begin{macro}{\pst@number,\tx@STP,\tx@STV}
-% \begin{itemize}
-% \item PSTricks' PostScript unit is 1pt, rather than 1bp, because this is
-% more efficient.
-% \item "\pst@number{<dimen register>}" converts <dimen> to PostScript, in
-% points (pt).
-% \item "\tx@STP" scales the DVI-to-PS driver's "\pstverb" environment to
-% points (pt).
-% \item "\tx@STV" scales the DVI-to-PS drivers's ungrouped PostScript
-% "\special" environment ("\pstVerb") to points (pt).
-% \end{itemize}
-% \begin{macrocode}
-\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
-\pst@def{STP}<\pst@stp>
-\pst@def{STV}<\pstverbscale\space\tx@STP>
-\def\pst@number#1{\pst@@dimtonum#1\space}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@checknum}
-% The first argument of "\pst@checknum" should be a number, and the second
-% argument is a command. There are three possible outcomes:
-% \begin{enumerate}
-% \item The number is suitable for PostScript consumption, the command is set
-% to the number, and "\pst@num" is set to "1" if the number is positive and to
-% "2" if the number is negative.
-% \item "\pst@checknum" detects that the number is not suitable for
-% PostScript; "\pst@num" is set to "0", an error is given, and the command is
-% defined to be {\tt 0 }.
-% \item The number is not suitable for PostScript consumption, but
-% "\pst@checknum" does not detect this. "\pst@num" is set to "1" or "2", and
-% the command is set to some number that {\em is} suitable for PostScript.
-% \end{enumerate}
-%
-% A trailing space is always added.
-%
-% "\pst@checknum" should generate no extraneous errors nor output, even if the
-% first argument is a bad number.
-%
-% This macro is probably pretty close to optimal for what it does, as many
-% variations have been tried.
-%
-% \begin{macrocode}
-\def\pst@checknum#1#2{%
- \edef\next{#1}%
- \ifx\next\@empty
- \let\pst@num\z@
- \else
- \expandafter\pst@@checknum\next..\@nil
- \fi
- \ifnum\pst@num=\z@
- \@pstrickserr{Bad number: `#1'. 0 substituted.}\@ehpa
- \def#2{0 }%
- \else
- \edef#2{\ifnum\pst@num=2 -\fi\the\pst@cntg.%
- \expandafter\@gobble\the\pst@cnth\space}%
- \fi}
-\def\pst@@checknum{%
- \@ifnextchar-%
- {\def\pst@num{2}\expandafter\pst@@@checknum\@gobble}%
- {\def\pst@num{1}\pst@@@checknum}}
-\def\pst@@@checknum#1.#2.#3\@nil{%
- \afterassignment\pst@@@@checknum\pst@cntg=0#1\relax\@nil
- \afterassignment\pst@@@@checknum\pst@cnth=1#2\relax\@nil}
-\def\pst@@@@checknum#1\relax\@nil{%
- \ifx\@nil#1\@nil\else\let\pst@num\z@\fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getnumii,\pst@getnumiii,\pst@getnumiv}
-% These are for processing comma-separated lists of numbers. They assign the
-% numbers to "\pst@tempg", "\pst@temph", etc. Use like
-% \begin{LVerbatim}
-% \pst@expandafter\pst@getnumiii{foo} {} {} {} {}\@ni
-% \end{LVerbatim}
-% If there are too few numbers, an error results. If there are too many, the
-% extra numbers are ignored.
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getdimnum}
-% Like "\pst@getnumii", but first item is a dimension and second is a number.
-% \begin{macrocode}
-\def\pst@getdimnum#1 #2 #3\@nil{%
- \pssetlength\pst@dimg{#1}%
- \pst@checknum{#2}\pst@tempg}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getscale}
-% "\pst@getscale" can have one or two numbers in its first argument.
-% \begin{macrocode}
-\def\pst@getscale#1#2{%
- \pst@expandafter\pst@getnumii{#1 #1} {} {} {}\@nil
- \edef#2{\pst@tempg\space \pst@temph\space scale }%
- \ifdim\pst@tempg\p@=\z@
- \@pstrickserr{Bad scaling argument `#1'}\@ehpa
- \def#2{}%
- \else
- \ifdim\pst@temph\p@=\z@
- \@pstrickserr{Bad scaling argument}\@ehpa
- \def#2{}%
- \else
- \ifdim\pst@tempg\p@=\p@ \ifdim\pst@temph\p@=\p@ \def#2{}\fi\fi
- \fi
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getint}
-% \begin{macrocode}
-\def\pst@getint#1#2{%
- \pst@cntg=#1\relax
- \edef#2{\the\pst@cntg\space}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pslbrace,\psrbrace}
-% When balanced braces are used, they work without problems in "\special"'s.
-% "\pslbrace" and "\psrbrace" let you use unbalanced braces.
-% \begin{macrocode}
-\begingroup
- \catcode`\{=12
- \catcode`\}=12
- \catcode`\[=1
- \catcode`\]=2
- \gdef\pslbrace[{ ]
- \gdef\psrbrace[} ]
-\endgroup
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Colors\label{Colors}}
-%
-% \begin{macro}{\@newcolor}
-% "\@newcolor{<color>}{<spec>}", where <color> is a name and <spec> is the
-% associated PostScript color specification , sets
-% \begin{itemize}
-% \item "\<color>" to "\pst@color{<spec>}", and
-% \item "\color@<color>" to <spec>.
-% \end{itemize}
-% Then "\<color>" can be used by the user to color text, etc., and
-% "\color@<color>" is used by PSTricks graphics objects to find the
-% specification for <color>.
-% \begin{macrocode}
-\def\@newcolor#1#2{%
- \expandafter\edef\csname #1\endcsname{\noexpand\pst@color{#2}}%
- \expandafter\edef\csname color@#1\endcsname{#2}%
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@color,\pst@endcolor}
-% The argument of "\pst@color" should be a PostScript command for setting the
-% color; e.g., "0 setgray". It saves the command in "\pst@currentcolor", and
-% then switches to "\pst@currentcolor" at the end of the current group. The
-% color changes do not extend across pages, although this capability could be
-% written into the output routines (so that "\pst@currentcolor" is set at the
-% beginning of the page, and headers and footers begin with "\black", etc.).
-% Moving boxes cause problems, but there is no way around this until \TeX{}
-% supports color internally.
-% \begin{macrocode}
-\def\pst@color#1{%
- \def\pst@currentcolor{#1}\pstVerb{#1}\aftergroup\pst@endcolor}
-\def\pst@endcolor{\pstVerb{\pst@currentcolor}}
-\def\pst@currentcolor{0 setgray}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\altcolormode,\pst@grestore}
-% The color macros defined above can conflict with other color macros.
-% "\altcolormode" sets up a different scheme that uses "gsave" and "grestore"
-% to reset colors. This may reduce the likelihood of such conflict. It also
-% makes moving boxes less of a problem, as long as the color command is itself
-% grouped within the box. However, if the scope of a color command extends
-% across pages in a \TeX{} input file, unmatched "gsave"'s and "grestore"'s
-% will be left on pages, wreaking havok on the output. "\pst@grestore" is
-% defined to do various things that makes using "grestore" more robust.
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@usecolor}
-% This looks up the color specification.
-% \begin{macrocode}
-\def\pst@usecolor#1{\csname color@#1\endcsname\space}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\newgray}
-% "\newgray" uses PostScript's "setgray" operator.
-% \begin{macrocode}
-\def\newgray#1#2{%
- \pst@checknum{#2}\pst@tempg
- \@newcolor{#1}{\pst@tempg setgray}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\newrgbcolor}
-% This works like "\newgray", but the color specification should consist of 3
-% numbers rather than just 1, and the "setrgbcolor" operator is used.
-% \begin{macrocode}
-\def\newrgbcolor#1#2{%
- \pst@expandafter\pst@getnumiii{#2} {} {} {} {}\@nil
- \@newcolor{#1}{\pst@tempg \pst@temph \pst@tempi setrgbcolor}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\newhsbcolor}
-% This is just like "\newrgbcolor", but the "sethsbcolor" operator is used.
-% \begin{macrocode}
-\def\newhsbcolor#1#2{%
- \pst@expandafter\pst@getnumiii{#2} {} {} {} {}\@nil
- \@newcolor{#1}{\pst@tempg \pst@temph \pst@tempi sethsbcolor}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\newcmykcolor}
-% This is like "\newrgbcolor", the color specification consists of 4 numbers
-% and the "setcmykcolor" operator is used.
-% \begin{macrocode}
-\def\newcmykcolor#1#2{%
- \pst@expandafter\pst@getnumiv{#2} {} {} {} {} {}\@nil
- \@newcolor{#1}{\pst@tempg \pst@temph \pst@tempi \pst@tempj setcmykcolor}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\black,\darkgray,\gray,\lightgray,\white}
-% Here are some default gray definitions:
-% \begin{macrocode}
-\newgray{black}{0}
-\newgray{darkgray}{.25}
-\newgray{gray}{.5}
-\newgray{lightgray}{.75}
-\newgray{white}{1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\red,\green,\blue,\yellow,\cyan,\magenta}
-% And some default rgb color definitions.
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Setting graphics parameters\label{Parameters}}
-%
-% \begin{macro}{\psset}
-% For each <parameter>"="<value> pair in its argument, "\psset" invokes
-% \begin{LVerbatim}
-% \psset@<parameter>{<value>}
-% \end{LVerbatim}
-% The value is processed and typically stored in "\ps<parameters>" if the
-% value is user-accessible and "\psk@<parameter>" if not. "\psset" ignores
-% spaces that follow the comma that separates key-value pairs.
-%
-% When initializing <parameter> in this file, preferable use
-% \begin{LVerbatim}
-% \psset@<parameter>{<value>}
-% \end{LVerbatim}
-% so that default values can be easily extracted for the {\em User's Guide}.
-% \begin{macrocode}
-\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}}}%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\newpsstyle}
-% \begin{macrocode}
-\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}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@none}
-% Use to check when a parameter value is "none".
-% \begin{macrocode}
-\def\@none{none}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getcolor}
-% This is used by various graphics parameters that are colors.
-% \begin{macrocode}
-\def\pst@getcolor#1#2{%
- \@ifundefined{color@#1}%
- {\@pstrickserr{Color `#1' not defined}\@eha}%
- {\edef#2{#1}}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Dimensions}
-%
-% \begin{macro}{\psunit,\psxunit,\psyunit}
-% \begin{macrocode}
-\newdimen\psunit \psunit 1cm
-\newdimen\psxunit \psxunit 1cm
-\newdimen\psyunit \psyunit 1cm
-\let\psrunit\psunit
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pssetlength,\psaddtolength,\pssetxlength,\pssetylength}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@unit,\psset@xunit,\psset@yunit}
-% \begin{macrocode}
-\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}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getlength,pst@@getlength}
-% "#1" is a \TeX\ dimensions. "\pst@getlength" sets "#2" to the PostScript
-% code for "#1", and "\pst@@getlength" set "#2" to the \TeX\ code for "#1".
-% \begin{macrocode}
-\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}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Normal Coordinates and angles}
-%
-% \begin{macro}{\pst@getcoor,\pst@coor}
-% "\pst@@getcoor" should be defined to read a coordinate and convert it to
-% PostScript, assigning the result to "\pst@coor" (including the trailing
-% space).
-%
-% "\pst@getcoor" invokes "\pst@@getcoor" and then sets its second argument to
-% "\pst@coor".
-% \begin{macrocode}
-\def\pst@getcoor#1#2{\pst@@getcoor{#1}\let#2\pst@coor}
-\def\pst@coor{0 0 }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getcoors,\pst@coors}
-% "\pst@getcoors" reads coordinates until there are none left, adding them
-% {\em in reverse order} to "\pst@coors".
-% \begin{macrocode}
-\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}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getangle,\pst@angle}
-% \n\pst@@getangle\ should be defined to read an angle and convert it to
-% PostScript, assigning the result to \n\pst@angle\ (including the trailing
-% space).
-%
-% \n\pst@getangle\ invokes \n\pst@@getangle\ and then sets its second argument
-% to \n\pst@angle.
-% \begin{macrocode}
-\def\pst@getangle#1#2{\pst@@getangle{#1}\let#2\pst@angle}
-\def\pst@angle{0 }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{getcoor@c,\NormalCoor}
-% By default, coordinates are read as Cartesian coordinates by
-% "\cartesian@coor".
-%
-% Angles are read as numbers, scaled by \n\pst@angleunit.
-%
-% "\NormalCoor" sets these two defaults, and also defines the translation for
-% the put commands to be done by \TeX\ using Cartesian coordinates.
-% \begin{macrocode}
-\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
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@angleunit,\degrees,\radians}
-% "\degrees" sets "\pst@angleunit" to the PostScript code for scaling the
-% angle, including the trailing space.
-% \begin{macrocode}
-\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{}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Special coordinates and angles}
-%
-% This is a tedious but useful.
-%
-% \begin{macro}{\SpecialCoor}
-% \begin{macrocode}
-\def\SpecialCoor{%
- \def\pst@@getcoor##1{\pst@expandafter\special@coor{##1}||\@nil}%
- \def\pst@@getangle##1{\pst@expandafter\special@angle{##1}\@empty)\@nil}%
- \def\psput@##1{\pst@@getcoor{##1}\leavevmode\psput@special}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\specialcoor}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\mixed@coor}
-% This allows mixing of coordinate types with \n\SpecialCoor.
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\polar@coor}
-% For polar coordinates
-% \begin{macrocode}
-\def\polar@coor#1#2{%
- \pssetlength\pst@dimg{#1}%
- \pst@@getangle{#2}%
- \edef\pst@coor{\pst@number\pst@dimg \pst@angle \tx@PtoC}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\raw@coor}
-% For raw PostScript.
-% \begin{macrocode}
-\def\raw@coor#1;#2\@nil{%
- \edef\pst@coor{%
- #1 \pst@number\psyunit mul exch \pst@number\psxunit mul exch }}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\node@coor,\Node@coor}
-% These are defined in "pst-node.tex".
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\special@angle}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\Cartesian,\Polar}
-% These are obsolete.
-% \begin{macrocode}
-\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}}}%
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Basic graphics parameters}
-%
-%
-% \begin{macro}{\psset@origin,\psk@origin}
-% \begin{macrocode}
-\def\psset@origin#1{%
- \pst@@getcoor{#1}%
- \edef\psk@origin{\pst@coor \tx@NET }}
-\def\psk@origin{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@swapaxes,\ifpsswapaxes}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@showpoints,\ifshowpoints}
-% \begin{macrocode}
-\newif\ifshowpoints
-\def\psset@showpoints#1{\@nameuse{showpoints#1}}
-\psset@showpoints{false}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@border,\psk@border}
-% \begin{macrocode}
-\let\pst@setrepeatarrowsflag\relax
-\def\psset@border#1{%
- \pst@getlength{#1}\psk@border
- \pst@setrepeatarrowsflag}
-\psset@border{0pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@bordercolor,\psbordercolor}
-% \begin{macrocode}
-\def\psset@bordercolor#1{\pst@getcolor{#1}\psbordercolor}
-\psset@bordercolor{white}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@doubleline,\ifpsdoubleline}
-% \begin{macrocode}
-\newif\ifpsdoubleline
-\def\psset@doubleline#1{%
- \@nameuse{psdoubleline#1}%
- \pst@setrepeatarrowsflag}
-\psset@doubleline{false}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@doublesep,\psdoublesep}
-% \begin{macrocode}
-\def\psset@doublesep#1{\def\psdoublesep{#1}}
-\psset@doublesep{1.25\pslinewidth}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@doublecolor,\psdoublecolor}
-% \begin{macrocode}
-\def\psset@doublecolor#1{\pst@getcolor{#1}\psdoublecolor}
-\psset@doublecolor{white}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@shadow,\ifpsshadow}
-% \begin{macrocode}
-\newif\ifpsshadow
-\def\psset@shadow#1{%
- \@nameuse{psshadow#1}%
- \pst@setrepeatarrowsflag}
-\psset@shadow{false}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@shadowsize,\psk@shadowsize}
-% \begin{macrocode}
-\def\psset@shadowsize#1{\pst@getlength{#1}\psk@shadowsize}
-\psset@shadowsize{3pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@shadowangle,\psk@shadowangle}
-% \begin{macrocode}
-\def\psset@shadowangle#1{\pst@getangle{#1}\psk@shadowangle}
-\psset@shadowangle{-45}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@shadowcolor,\psshadowcolor}
-% \begin{macrocode}
-\def\psset@shadowcolor#1{\pst@getcolor{#1}\psshadowcolor}
-\psset@shadowcolor{darkgray}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@setrepeatarrowsflag}
-% \begin{macrocode}
-\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}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \section{Line styles\label{Linestyles}}
-%
-% For each "linestyle" <style>, the command "\psls@<style>" should be the
-% PostScript code that strokes the path. The style can assume that the
-% PostScript environment has linewidth equal to \n\pslinewidth\ and color
-% equal to \n\pslinecolor.
-%
-% \begin{macro}{\pst@linetype}
-% Macros that draw lines should define "\pst@linetype" (not a count register)
-% to be:
-% \begin{description}
-% \item[1,2,$\ldots$] A closed path whose length should be divided by
-% "\pst@linetype" before fitting a pattern.
-% \item[0] A line that has nothing at the tips.
-% \item[-1] A line with an arrow or something at the end.
-% \item[-2] A line with an arrow or something at the beginning.
-% \item[-3] A line with an arrow or something at each end.
-% \end{description}
-% This information is used by the line styles that draw dashed and dotted
-% lines in order to figure out how to adjust the patterns.
-% \end{macro}
-%
-% \begin{macro}{\psls@none}
-% \begin{macrocode}
-\def\psls@none{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@linewidth,\pslinewidth}
-% \begin{macrocode}
-\newdimen\pslinewidth
-\def\psset@linewidth#1{\pssetlength\pslinewidth{#1}}
-\psset@linewidth{.8pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@linecolor,\pslinecolor}
-% \begin{macrocode}
-\def\psset@linecolor#1{\pst@getcolor{#1}\pslinecolor}
-\psset@linecolor{black}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psls@solid}
-% \begin{macrocode}
-\def\psls@solid{0 setlinecap stroke }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@dash,\psk@dash}
-% "\psk@dash" is set to the PostScript code for the dash pattern (include the
-% trailing space).
-% \begin{macrocode}
-\def\psset@dash#1{%
- \pst@expandafter\psset@@dash{#1} * * *\@nil
- \edef\psk@dash{\pst@number\pst@dimg \pst@number\pst@dimh}}
-\def\psset@@dash#1 #2 #3\@nil{%
- \pssetlength\pst@dimg{#1}%
- \pssetlength\pst@dimh{#2}}
-\psset@dash{5pt 3pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psls@dashed}
-% \begin{macrocode}
-\def\psls@dashed{\psk@dash \pst@linetype\space \tx@DashLine}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@DashLine}
-% Syntax:
-% \begin{Ex}
-% <dim1 dim2 linetype> "DashLine"
-% \end{Ex}
-% "DashLine" adjusts, and then sets, the dash pattern "[<dim1 dim2>]" so that
-% it fits evenly onto a path.
-% \begin{macrocode}
-\pst@def{DashLine}<%
- % "a" is set to the length of first and last black segment, as fraction of
- % usual black segment.
- dup 0 gt
- { /a .5 def \tx@PathLength exch div }
- { pop /a 1 def \tx@PathLength }
- ifelse
- /b ED % Pattern should fit evenly in b
- /x ED % Length of white segment.
- /y ED % Length of black segment.
- /z y x add def % Total length of dash pattern.
- % If pattern is repeated n times, total length is (nz + 2(a-.5)y).
- % Set length to b, solve for n, round, and leave on stack:
- % n = round((b - 2(a-.5)y)/z)
- b a .5 sub 2 mul y mul sub z \tx@Div round
- % Adjust x and y by factor k so that
- % (n(kz) + 2(a-.5)(ky)) = b.
- % Solve for k and leave two copies on stack:
- % k = b/(nz + 2(a-.5)y)
- z mul a .5 sub 2 mul y mul add b exch \tx@Div dup
- % Scale x and y, set dash, and stroke:
- y mul /y ED x mul /x ED
- % Make sure both x and y aren't zero:
- x 0 eq y 0 eq and { /x 1 def /y 1 def } if
- [ y x ] 1 a sub y mul setdash stroke>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{dotsep}
-% \begin{macrocode}
-\def\psset@dotsep#1{\pst@getlength{#1}\psk@dotsep}
-\psset@dotsep{3pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psls@dotted}
-% \begin{macrocode}
-\def\psls@dotted{\psk@dotsep \pst@linetype\space \tx@DotLine}%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@DotLine}
-% Syntax:
-% \begin{Ex}
-% <dim linetype> "DotLine"
-% \end{Ex}
-% "DotLine" adjusts, and then sets, the dash pattern to produce a dotted line
-% with distance <dim> between dots so that it fits evenly onto a path. Dots
-% are produced by setting dash pattern with length of white segment equal to
-% distance from center of dot to center of dot, length of black segment equal
-% to 0, and "linecap" equal to 1.
-% \begin{macrocode}
-\pst@def{DotLine}<%
- /b \tx@PathLength def % Path length.
- /a ED % \pst@linetype.
- /z ED % dotsep.
- /y CLW def % linewidth (dot diameter).
- /z y z add def % Total length of dash pattern.
- % Set b to adjusted path length that pattern should be multiple of:
- a 0 gt
- % If closed, as many dots as spaces.
- { /b b a div def }
- { a 0 eq
- % If open with no arrows, one more dot than space.
- { /b b y sub def }
- % If open one arrow, as many dots as spaces (do nothing)
- % If open two arrows, one more space than dot.
- { a -3 eq { /b b y add def } if }
- ifelse }
- ifelse
- % Let n be number of times pattern is repeated:
- % n = round(b/z)
- % Adjust length of pattern so that it fits evenly in b:
- % z = b/n = b/(round(b/z))
- % z is length of white segment. Length of black segment is 0.
- [ 0 b b z \tx@Div round \tx@Div dup 0 le { pop 1 } if ]
- a 0 gt % setting dash pattern.
- % Set offset to 0 if path is closed]
- { 0 }
- % Set offset to -(y/2) if open curve begins with arrow, (y/2) otherwise:
- { y 2 div a -2 gt { neg } if }
- ifelse
- % Setting linecap to 1 produces the dots.
- setdash 1 setlinecap stroke>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@linestyle}
-% \begin{macrocode}
-\def\psset@linestyle#1{%
- \@ifundefined{psls@#1}%
- {\@pstrickserr{Line style `#1' not defined}\@eha}%
- {\edef\pslinestyle{#1}}}
-\psset@linestyle{solid}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Fill styles\label{Fillstyles}}
-%
-% For each "fillstyle" <style>, the command "\psfs@<style>" should be the
-% PostScript code that fills the region. The style should not assume anything
-% about the PostScript environment's "linewidth" or color.
-%
-% \begin{macro}{\psfs@none}
-% \begin{macrocode}
-\def\psfs@none{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@fillcolor,\psfillcolor}
-% \begin{macrocode}
-\def\psset@fillcolor#1{\pst@getcolor{#1}\psfillcolor}
-\psset@fillcolor{white}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psfs@solid}
-% \begin{macrocode}
-\def\psfs@solid{\pst@usecolor\psfillcolor fill }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{hatchwidth}
-% \begin{macrocode}
-\def\psset@hatchwidth#1{\pst@getlength{#1}\psk@hatchwidth}
-\psset@hatchwidth{.8pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{hatchsep}
-% \begin{macrocode}
-\def\psset@hatchsep#1{\pst@getlength{#1}\psk@hatchsep}
-\psset@hatchsep{4pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{hatchcolor}
-% \begin{macrocode}
-\def\psset@hatchcolor#1{\pst@getcolor{#1}\pshatchcolor}
-\psset@hatchcolor{black}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{hatchangle}
-% \begin{macrocode}
-\def\psset@hatchangle#1{\pst@getangle{#1}\psk@hatchangle}
-\psset@hatchangle{45}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psfs@hlines}
-% \begin{macrocode}
-\def\psfs@hlines{%
- \psk@hatchangle rotate
- \psk@hatchwidth SLW
- \pst@usecolor\pshatchcolor
- \psk@hatchsep \tx@LineFill}
-\@namedef{psfs@hlines*}{gsave \psfs@solid grestore \psfs@hlines}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@LineFill}
-% \begin{macrocode}
-\pst@def{LineFill}<%
- abs CLW add /a ED % hatchsep
- gsave
- clip
- pathbbox %leave llx,lly,urx,ury on stack
- a \tx@Div ceiling /y2 ED % Number of top line to be drawn.
- /x2 ED
- a \tx@Div floor /y1 ED % Number of bottom line to be drawn
- /x1 ED
- /n y2 y1 sub 1 add cvi def % Number of lines.
- /y1 a y1 mul def % y-coordinate of bottom line.
- newpath 2 setlinecap
- n
- { currentstrokeadjust ==
- x1 y1 moveto
- x2 y1 L
- stroke
- /y1 y1 a add def }
- repeat
- grestore>
-\pst@def{LineFill}<%
- abs CLW add /a ED % hatchsep
- gsave
- clip
- pathbbox %leave llx,lly,urx,ury on stack
- a \tx@Div ceiling /y2 ED % Number of top line to be drawn.
- /x2 ED
- a \tx@Div floor /y1 ED % Number of bottom line to be drawn
- /x1 ED
- /n y2 y1 sub 1 add cvi def % Number of lines.
- /y1 a y1 mul def % y-coordinate of bottom line.
- newpath 2 setlinecap
- systemdict /currentstrokeadjust known % Level 2
- { currentstrokeadjust }
- { false }
- ifelse
- { /t { } def }
- { /t {
- transform
- 0.25 sub round 0.25 add exch
- 0.25 sub round 0.25 add exch
- itransform
- } bind def }
- ifelse
- n {
- x1 y1 t moveto
- x2 y1 t L
- stroke
- /y1 y1 a add def
- } repeat
- grestore>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psfs@vlines}
-% \begin{macrocode}
-\def\psfs@vlines{%
- 90 rotate
- \psfs@hlines}
-\@namedef{psfs@vlines*}{gsave \psfs@solid grestore \psfs@vlines}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psfs@crosshatch}
-% \begin{macrocode}
-\def\psfs@crosshatch{gsave \psfs@hlines grestore \psfs@vlines}
-\@namedef{psfs@crosshatch*}{%
- gsave \psfs@solid grestore
- gsave \psfs@hlines grestore
- \psfs@vlines}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{fillstyle}
-% \begin{macrocode}
-\def\psset@fillstyle#1{%
- \@ifundefined{psfs@#1}%
- {\@pstrickserr{Undefined fill style: `#1'}\@eha}%
- {\edef\psfillstyle{#1}}}
-\psset@fillstyle{none}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Arrowheads and t-bars\label{Arrowheads}}
-%
-% It would be nice to use a font, with hinting.
-%
-% \begin{macro}{\psset@arrows,\psk@arrowA,\psk@arrowB}
-% "\if@pst" is used as a flag for errors.
-% \begin{macrocode}
-\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{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@arrowtable}
-% This is a translator for "arrowA". Add to it with "\edef", as in
-% \begin{LVerbatim}
-% \edef\pst@arrowtable{\pst@arrowtable,*o-o*}
-% \end{LVerbatim}
-% \begin{macrocode}
-\def\pst@arrowtable{,<->,<<->>,>-<,>>-<<,(-),[-]}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@activearrows}
-% This redefines certain characters in case they are active, before expanding
-% the "arrows" argument. Add to it with "\expandafter", as in
-% \begin{LVerbatim}
-% \begingroup
-% \catcode`\:=13
-% \expandafter\gdef\expandafter\pst@activearrows
-% \expandafter{\def:{\string:}}
-% \endgroup
-% \end{LVerbatim}
-% \begin{macrocode}
-\begingroup
- \catcode`\<=13
- \catcode`\>=13
- \catcode`\|=13
- \gdef\pst@activearrows{\def<{\string<}\def>{\string>}\def|{\string|}}
-\endgroup
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{BeginArrow,EndArrow}
-% For each arrow <arrow>, "\psas@<arrow>" should be PostScript code so that
-% \begin{LVerbatim}
-% <y2 x2 y1 x1> BeginArrow \psk@arrowscale \psas@<arrow> EndArrow
-% \end{LVerbatim}
-% \begin{itemize}
-% \item Draws an arrow with the tip at <x1 y1>, and
-% \item Leaves on the stack <y2 x2 x1' y1'>, where <x1' y1'> is the position
-% that a connecting line should start from.
-% \end{itemize}
-%
-% "BeginArrow" sets up an environment so that "\psas@<arrow>" only has to draw
-% an arrow pointing down and with the tip at "0 0" and , and leave the current
-% point where a connecting line should start from. "EndArrow" then restores
-% the original environment and translates the current point into the original
-% coordinate system.
-%
-% A special dictionary "ADict" is used with arrows so that scratch variables
-% will not conflict. The matrix is saved as "@mtrx" to indicate that the arrow
-% procedures should not change this. The same is true for "@x1", "@y1", "@x2",
-% "@y2" and "@angle", which are used by a patch of "BeginArrow" and "EndArrow"
-% that is required for some versions of Sun's NewsPrint (see "read-me.pst").
-% \begin{macrocode}
-\pst@def{BeginArrow}<%
- ADict begin
- /@mtrx CM def
- gsave
- 2 copy T
- 2 index sub neg exch 3 index sub exch \tx@Atan
- rotate
- newpath>
-\pst@def{EndArrow}<@mtrx setmatrix CP grestore end>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{arrowscale}
-% \begin{macrocode}
-\def\psset@arrowscale#1{\pst@getscale{#1}\psk@arrowscale}
-\psset@arrowscale{1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@arrowsize,\psk@arrowsize}
-% \begin{macrocode}
-\def\psset@arrowsize#1{%
- \pst@expandafter\pst@getdimnum{#1} {} {} {}\@nil
- \edef\psk@arrowsize{\pst@number\pst@dimg \pst@tempg}}
-\psset@arrowsize{2pt 3}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@arrowlength,\psk@arrowlength}
-% \begin{macrocode}
-\def\psset@arrowlength#1{\pst@checknum{#1}\psk@arrowlength}
-\psset@arrowlength{1.4}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@arrowinset,\psk@arrowinset}
-% \begin{macrocode}
-\def\psset@arrowinset#1{\pst@checknum{#1}\psk@arrowinset}%
-\psset@arrowinset{.4}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@Arrow}
-% Syntax:
-% \begin{LVerbatim}
-% <boolean> \psk@arrowinset \psk@arrowlength \psk@arrowsize Arrow
-% \end{LVerbatim}
-% <boolean> is "true" for reverse arrows and "false" for normal arrows.
-% \begin{macrocode}
-\pst@def{Arrow}<%
- CLW mul add dup % width
- 2 div /w ED % Half width
- mul dup /h ED % Height
- mul /a ED % Inset
- { 0 h T 1 -1 scale } if % For reverse arrows
- w neg h moveto
- 0 0 L
- w h L
- w neg a neg rlineto
- gsave fill grestore>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@>}
-% \begin{macrocode}
-\@namedef{psas@>}{%
- false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@>>}
-% \begin{macrocode}
-\@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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begingroup
-% \catcode`\<=12
-% \begin{macro}{\psas@<}
-% \begin{macrocode}
-\@namedef{psas@<}{%
- true \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@<<}
-% \begin{macrocode}
-\@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}
-% \end{macrocode}
-% \end{macro}
-% \endgroup
-%
-% \begin{macro}{\psset@tbarsize,\psk@tbarsize}
-% \begin{macrocode}
-\def\psset@tbarsize#1{%
- \pst@expandafter\pst@getdimnum{#1} {} {} {}\@nil
- \edef\psk@tbarsize{\pst@number\pst@dimg \pst@tempg}}
-\psset@tbarsize{2pt 5}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{Tbar}
-% Syntax
-% \begin{LVerbatim}
-% \psk@tbarsize Tbar
-% \end{LVerbatim}
-% \begin{macrocode}
-\pst@def{Tbar}<%
- CLW mul add /z ED % width
- z -2 div CLW 2 div moveto
- z 0 rlineto
- stroke
- 0 CLW moveto>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@|}
-% \begin{macrocode}
-\@namedef{psas@|}{\psk@tbarsize \tx@Tbar}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@|*}
-% \begin{macrocode}
-\@namedef{psas@|*}{0 CLW -2 div T \psk@tbarsize \tx@Tbar}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@bracketlength,\psk@bracketlength}
-% \begin{macrocode}
-\def\psset@bracketlength#1{\pst@checknum{#1}\psk@bracketlength}
-\psset@bracketlength{.15}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@Bracket,\tx@@Bracket}
-% Syntax
-% \begin{LVerbatim}
-% \psk@bracketlength \psk@tbarsize Bracket
-% \end{LVerbatim}
-% \begin{macrocode}
-\pst@def{Bracket}<%
- CLW mul add dup
- CLW sub 2 div /x ED % adjusted half width
- mul CLW add /y ED % y-position of height
- /z CLW 2 div def
- x neg y moveto
- x neg CLW 2 div L
- x CLW 2 div L
- x y L
- stroke
- 0 CLW moveto>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@]}
-% \begin{macrocode}
-\@namedef{psas@]}{\psk@bracketlength \psk@tbarsize \tx@Bracket}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@rbracketlength,\psk@rbracketlength}
-% \begin{macrocode}
-\def\psset@rbracketlength#1{\pst@checknum{#1}\psk@rbracketlength}
-\psset@rbracketlength{.15}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{RoundBracket}
-% Syntax
-% \begin{LVerbatim}
-% \psk@bracketlength \psk@tbarsize RoundBracket
-% \end{LVerbatim}
-% \begin{macrocode}
-\pst@def{RoundBracket}<%
- CLW mul add dup
- 2 div /x ED % half width
- mul /y ED % height
- /mtrx CM def
- 0 CLW 2 div T
- x y mul 0 ne { x y scale } if
- 1 1 moveto
- .85 .5 .35 0 0 0 curveto
- -.35 0 -.85 .5 -1 1 curveto
- mtrx setmatrix
- stroke
- 0 CLW moveto>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@(}
-% \begin{macrocode}
-\@namedef{psas@)}{\psk@rbracketlength \psk@tbarsize \tx@RoundBracket}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@c,\psas@cc,\psas@C}
-% This is not going to be used frequently, and so we don't bother defining a
-% PostScript procedure in the header.
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@}
-% \begin{macrocode}
-\def\psas@{}
-\psset@arrows{-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Graphics objects: processing arguments}
-%
-% \begin{macro}{\pst@par,\addto@par,\use@par}
-% Graphics objects accumulate <parameter>=<value> pairs in the command
-% sequence "\pst@par". They use "\addto@par" to add to "\pst@par", and
-% "\use@par" to make the parameter changes effective.
-% \begin{macrocode}
-\def\pst@par{}
-\def\addto@par#1{%
- \ifx\pst@par\@empty
- \def\pst@par{#1}%
- \else
- \expandafter\def\expandafter\pst@par\expandafter{\pst@par,#1}%
- \fi}
-\def\use@par{%
- \ifx\pst@par\@empty\else
- \expandafter\@psset\pst@par,\@nil
- \def\pst@par{}%
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@object}
-% Any macro, such as "\psline", that uses graphics parameters should begin as
-% follows:
-% \begin{LVerbatim}
-% \def\psline{\def\pst@par{}\pst@object{psline}}
-% \def\psline@i{ ... }
-% \end{LVerbatim}
-% "\pst@object" checkes for the optional "[<par>=<value>,...]" argument, adds
-% key-value pairs to "\pst@par" if found, skips spaces, and then invokes
-% "\psline@i".
-% \begin{macrocode}
-\def\pst@object#1{%
- \pst@ifstar{\@ifnextchar[{\pst@@object{#1}}{\@nameuse{#1@i}}}}
-\def\pst@@object#1[#2]{%
- \addto@par{#2}\@ifnextchar+{\@nameuse{#1@i}}{\@nameuse{#1@i}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\newpsobject}
-% For example,
-% \begin{LVerbatim}
-% \newpsobject{dottedline}{psline}{linestyle=dotted}
-% \end{LVerbatim}
-% has the following effect:
-% \begin{LVerbatim}
-% \def\dottedline{%
-% \def\pst@par{linestyle=dotted}\pst@object{psline}}
-% \end{LVerbatim}
-% and thus "\dottedline" is just like "\psline", except that the default falue
-% of "linestyle" is changed to "dotted".
-% \begin{macrocode}
-\def\newpsobject#1#2#3{%
- \@ifundefined{#2@i}%
- {\@pstrickserr{Graphics object `#2' not defined}\@eha}%
- {\@namedef{#1}{\def\pst@par{#3}\pst@object{#2}}}\ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getarrows}
-% "\pst@getarrows{foo}" checks for an optional argument containing arrows, and
-% then invokes "foo". The arrows argument must be followed by "(".
-% \begin{macrocode}
-\def\pst@getarrows#1{\@ifnextchar({#1}{\pst@@getarrows{#1}}}
-\def\pst@@getarrows#1#2{\addto@par{arrows=#2}#1}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Graphics objects: Basics \TeX\ macros\label{Objects}}
-%
-% Each graphics object should use one of the following:
-% \begin{center}
-% \begin{tabular}{ll}
-% "\begin@OpenObj ... \end@OpenObj" & Open curves with arrows.\\
-% "\begin@AltOpenObj ... \end@AltOpenObj" & Open curves w/o arrows.\\
-% "\begin@ClosedObj ... \end@ClosedObj" & Closed curves.\\
-% "\begin@SpecialObj ... \end@SpecialObj" & Other.
-% \end{tabular}
-% \end{center}
-% This makes it possible for "\pscustom" to work by redefining these.
-%
-% \begin{macro}{\begin@ClosedObj,\end@ClosedObj}
-% \begin{macrocode}
-\def\begin@ClosedObj{%
- \leavevmode
- \pst@killglue
- \begingroup
- \use@par
- \solid@star
- \ifpsdoubleline \pst@setdoublesep \fi
- \init@pscode}
-\def\end@ClosedObj{%
- \ifpsshadow \pst@closedshadow \fi
- \ifdim\psk@border\p@>\z@ \pst@addborder \fi
- \pst@fill
- \pst@stroke
- \ifpsdoubleline \pst@doublestroke \fi
- \ifshowpoints
- \addto@pscode{Points aload length 2 div cvi /N ED \psdots@iii}%
- \fi
- \use@pscode
- \endgroup
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\begin@OpenObj,\begin@AltOpenObj,\end@OpenObj}
-% \begin{macrocode}
-\def\begin@OpenObj{%
- \begin@ClosedObj
- \let\pst@linetype\pst@arrowtype
- \pst@addarrowdef}
-\def\begin@AltOpenObj{%
- \begin@ClosedObj
- \def\pst@repeatarrowsflag{\z@}%
- \def\pst@linetype{0}}
-\def\end@OpenObj{%
- \ifpsshadow \pst@openshadow \fi
- \ifdim\psk@border\p@>\z@ \pst@addborder \fi
- \pst@fill
- \pst@stroke
- \ifpsdoubleline \pst@doublestroke \fi
- \ifnum\pst@repeatarrowsflag>\z@ \pst@repeatarrows \fi
- \ifshowpoints \pst@OpenShowPoints \fi
- \use@pscode
- \endgroup
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\begin@SpecialObj,\end@SpecialObj}
-% \begin{macrocode}
-\def\begin@SpecialObj{%
- \leavevmode
- \pst@killglue
- \begingroup
- \use@par
- \init@pscode}
-\def\end@SpecialObj{%
- \use@pscode
- \endgroup
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\init@pscode,\addto@pscode,\use@pscode}
-% Graphics objects are built up by adding PostScript code to "\pst@code" with
-% "\addto@pscode". "\use@pscode" then adds leading and trailing PostScript
-% code, and (normally) inserts it in a "\special" (it also most empty
-% "\pst@code"). Hacks like "\psclip", "\multips" and "\pstextpath" work by
-% redefining "\use@pscode". These hacks use "\use@pscode" themselves when
-% appropriate, making limited nesting of these hacks is possible. "\PSTtoEPS"
-% works be redefining "\addto@pscode" so that it writes to a file. All this
-% was carefully designed so that these hacks would work. Watch out!
-% \begin{macrocode}
-\def\pst@code{}%
-\def\init@pscode{%
- \addto@pscode{%
- \pst@number\pslinewidth SLW
- \pst@usecolor\pslinecolor}}
-\def\addto@pscode#1{\xdef\pst@code{\pst@code#1\space}}
-\def\use@pscode{%
- \pstverb{%
- \pst@dict
- \tx@STP
- newpath
- \psk@origin
- \psk@swapaxes
- \pst@code
- end}%
- \gdef\pst@code{}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@killglue}
-% \begin{macrocode}
-\def\KillGlue{%
- \def\pst@killglue{\unskip\ifdim\lastskip>\z@\expandafter\pst@killglue\fi}}
-\def\DontKillGlue{\let\pst@killglue\relax}
-\DontKillGlue
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\solid@star}
-% The optional "*" is typically used to make a solid option. This means that
-% "linestyle" is set to "none", "linewidth" is set to "0", and "fillcolor" is
-% set to "linecolor".
-% \begin{macrocode}
-\def\solid@star{%
- \if@star
- \pslinewidth=\z@
- \psdoublelinefalse
- \def\pslinestyle{none}%
- \def\psfillstyle{solid}%
- \let\psfillcolor\pslinecolor
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@setdoublesep}
-% \begin{macrocode}
-\def\pst@setdoublesep{%
- \pst@getlength\psdoublesep\psdoublesep
- \pslinewidth=2\pslinewidth
- \advance\pslinewidth\psdoublesep\p@
- \let\pst@setdoublesep\relax}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@Shadow}
-% Syntax:
-% \begin{Ex}
-% <x y> Shadow
-% \end{Ex}
-% translates current path by <x y>.
-% \begin{macrocode}
-\pst@def{Shadow}<%
- [
- { /moveto load }
- { /lineto load }
- { /curveto load }
- { /closepath load }
- pathforall
- ]
- cvx
- newpath
- 3 1 roll
- T
- exec>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@closedshadow}
-% \begin{macrocode}
-\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}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@openshadow}
-% \begin{macrocode}
-\def\pst@openshadow{%
- \addto@pscode{%
- gsave
- \psk@shadowsize \psk@shadowangle \tx@PtoC
- \tx@Shadow
- \pst@usecolor\psshadowcolor
- \ifx\psfillstyle\@none\else
- gsave fill grestore
- \fi
- stroke}%
- \pst@repeatarrows
- \addto@pscode{grestore}
- \ifx\psfillstyle\@none\else
- \addto@pscode{%
- gsave
- \pst@usecolor\psfillcolor
- gsave fill grestore
- stroke
- grestore}
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@addborder}
-% \begin{macrocode}
-\def\pst@addborder{%
- \addto@pscode{%
- gsave
- \psk@border 2 mul
- CLW add SLW
- \pst@usecolor\psbordercolor
- stroke
- grestore}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@stroke}
-% \begin{macrocode}
-\def\pst@stroke{%
- \ifx\pslinestyle\@none\else
- \addto@pscode{%
- gsave
- \pst@number\pslinewidth SLW
- \pst@usecolor\pslinecolor
- \@nameuse{psls@\pslinestyle}
- grestore}%
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@fill}
-% \begin{macrocode}
-\def\pst@fill{%
- \ifx\psfillstyle\@none\else
- \addto@pscode{gsave \@nameuse{psfs@\psfillstyle} grestore}%
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@doublestroke}
-% \begin{macrocode}
-\def\pst@doublestroke{%
- \addto@pscode{%
- gsave
- \psdoublesep SLW
- \pst@usecolor\psdoublecolor
- stroke
- grestore}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@arrowtype}
-% \begin{macrocode}
-\def\pst@arrowtype{%
- \ifx\psk@arrowB\@empty 0 \else -2 \fi
- \ifx\psk@arrowA\@empty 0 \else -1 \fi
- add}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@addarrowdef,\pst@arrowdef,\pst@arrowtype}
-% "ArrowA" takes two coordinates from the stack, draws the arrow with the tip
-% at the top coordinate, leaves the second coordinate on the stack and leaves
-% the current point where a line should join.
-%
-% "ArrowB" takes two coordinates from the stack, draws the arrow with the tip
-% at the top coordinate, and leaves both coordinates on the stack, without
-% changing the graphics state.
-%
-% This particular definition of "ArrowA" is important for "\pscustom".
-%
-% "ArrowA" and "ArrowB" might also save the arrow coordinates, because
-% sometimes it is necessary to redraw the arrows (see
-% "\pst@setrepeatarrowsflag").
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@repeatarrows}
-% \begin{macrocode}
-\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}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@OpenShowPoints}
-% \begin{macrocode}
-\def\pst@OpenShowPoints{%
- \addto@pscode{%
- gsave
- \psk@dotsize
- \@nameuse{psds@\psk@dotstyle}
- /TheDot {
- gsave T \psk@dotangle \psk@dotscale Dot grestore
- } def
- newpath
- Points aload length 2 div 2 sub cvi /N ED
- N 0 ge
- { \ifx\psk@arrowA\@empty
- TheDot
- \else
- pop pop
- \fi
- N { TheDot } repeat
- \ifx\psk@arrowB\@empty
- TheDot
- \else
- pop pop
- \fi }
- { N 2 mul { pop } repeat }
- ifelse
- grestore}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Custom graphics}
-%
-% Graphics objects using "\begin@SpecialObj" cannot be used with "\pscustom".
-% It is up to the other graphics objects to be compatible with "\pscustom".
-% This means:
-% \begin{itemize}
-% \item To use the current point as an additional coordinate, when it exists,
-% the graphics object should insert "\pst@cp".
-% \item For graphics objects that use "\begin@OpenObj", the "ArrowA" is
-% defined by "\pscustom" to connect the top coordinate with the current point
-% by a line, if there is a current point. Other graphics objects should use
-% "\pst@oplineto" as a substitute for "moveto" if they wish to connect a
-% coordinate to the current point if it exists.
-% \end{itemize}
-%
-% Closed graphics objects are not under an obligation to anything particularly
-% sensible the current point exists.
-%
-% \begin{macro}{\pscustom}
-% The main graphics object modifies "\begin@OpenObj" and "\end@OpenObj" so
-% that the open curves extend the current path.
-% \begin{macrocode}
-\def\pscustom{\def\pst@par{}\pst@object{pscustom}}
-\long\def\pscustom@i#1{%
- \begin@SpecialObj
- \solid@star
- \let\pst@ifcustom\iftrue
- \let\begin@ClosedObj\begin@CustomObj
- \let\end@ClosedObj\endgroup
- \def\begin@OpenObj{\begin@CustomObj\pst@addarrowdef}%
- \let\end@OpenObj\endgroup
- \let\begin@AltOpenObj\begin@CustomObj
- \def\begin@SpecialObj{%
- \begingroup
- \pst@misplaced{special graphics object}%
- \def\addto@pscode####1{}
- \let\end@SpecialObj\endgroup}%
- \def\@multips(##1)(##2)##3##4{\pst@misplaced\multips}%
- \def\psclip##1{\pst@misplaced\psclip}%
- \def\pst@repeatarrowsflag{\z@}%
- \let\pst@setrepeatarrowsflag\relax
- \showpointsfalse
- \let\showpointstrue\relax
- \def\pst@linetype{\pslinetype}%
- \let\psset@liftpen\psset@@liftpen
- \psset@liftpen{\z@}%
- \def\pst@cp{/currentpoint load stopped pop }%
- \def\pst@oplineto{/lineto load stopped { moveto } if }%
- \def\pst@optcp##1##2{%
- \ifnum##1=\z@\def##2{/currentpoint load stopped { 0 0 } if }\fi}%
- \let\caddto@pscode\addto@pscode
- \def\cuse@par##1{{\use@par##1}}%
- \the\pst@customdefs
- \setbox\pst@hbox=\hbox{#1}%
- \pst@fill
- \pst@stroke
- \end@SpecialObj}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\begin@CustomObj,\end@CustomObj}
-% \begin{macrocode}
-\def\begin@CustomObj{%
- \begingroup
- \use@par
- \addto@pscode{%
- \pst@number\pslinewidth SLW
- \pst@usecolor\pslinecolor}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@liftpen,\pst@cp,\pst@oplineto,\pst@optcp}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@linetype,\pslinetype}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caddto@pscode}
-% Commands that should only occur in "\pscustom" should use this. Obsolete?
-% \begin{macrocode}
-\def\caddto@pscode#1{%
- \@pstrickserr{Command can only be used in \string\pscustom}\@ehpa}
-\let\cuse@par\caddto@pscode
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@MSave,\tx@MRestore}
-% It doesn't seem worth adding these to the header file.
-% \begin{macrocode}
-\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 }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psmove,\psclosepath,\psgroup}
-% \begin{macrocode}
-\newtoks\pst@customdefs
-\pst@customdefs{%
- \def\newpath{\addto@pscode{newpath}}%
- \def\moveto(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor moveto}}%
- \def\closepath{\addto@pscode{closepath}}%
- \def\gsave{\begingroup\addto@pscode{gsave}}%
- \def\grestore{\endgroup\addto@pscode{grestore}}%
- \def\translate(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor moveto}}%
- \def\rotate#1{\pst@@getangle{#1}\addto@pscode{\pst@angle rotate}}%
- \def\scale#1{\pst@getscale{#1}\pst@tempg\addto@pscode{\pst@tempg}}%
- \def\msave{\addto@pscode{\tx@MSave}}%
- \def\mrestore{\addto@pscode{\tx@MRestore}}%
- \def\swapaxes{\addto@pscode{-90 rotate -1 1 scale}}%
- \def\stroke{\def\pst@par{}\pst@object{stroke}}%
- \def\fill{\def\pst@par{}\pst@object{fill}}%
- \def\openshadow{\def\pst@par{}\pst@object{openshadow}}%
- \def\closedshadow{\def\pst@par{}\pst@object{closedshadow}}%
- \def\movepath(#1){\pst@@getcoor{#1}\addto@pscode{\pst@coor tx@Shadow}}%
- \def\lineto{\pst@onecoor{lineto}}%
- \def\rlineto{\pst@onecoor{rlineto}}%
- \def\curveto{\pst@threecoor{curveto}}%
- \def\rcurveto{\pst@threecoor{rcurveto}}%
- \def\code#1{\addto@pscode{#1}}%
- \def\coor(#1){\pst@@getcoor{#1}\addto@pscode\pst@coor\@ifnextchar({\coor}{}}%
- \def\rcoor{\pst@getcoors{}{}}%
- \def\dim#1{\pssetlength\pst@dimg{#1}\addto@pscode{\pst@number\pst@dimg}}%
- \def\setcolor#1{%
- \@ifundefined{color@#1}{}{\addto@pscode{\use@color{#1}}}}%
- \def\arrows#1{{\psset@arrows{#1}\pst@addarrowdef}}%
- \let\file\pst@rawfile
-} % END \pst@customdefs
-\def\closedshadow@i{\cuse@par\pst@closedshadow}
-\def\openshadow@i{\cuse@par\pst@openshadow}
-\def\stroke@i{\cuse@par\pst@stroke}%
-\def\fill@i{\cuse@par\pst@fill}%
-\def\pst@onecoor#1(#2){%
- \pst@@getcoor{#2}%
- \addto@pscode{\pst@coor #1}}
-\def\pst@threecoor#1(#2)#3(#4)#5(#6){%
- \begingroup
- \pst@getcoor{#2}\pst@tempa
- \pst@getcoor{#4}\pst@tempb
- \pst@getcoor{#6}\pst@tembc
- \addto@pscode{\pst@tempa \pst@tempb \pst@tempc #1}%
- \endgroup}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\psrawfile,\pst@rawfile}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-% \section{Graphics objects: Basic PostScript macros}
-%
-% \begin{macro}{SD}
-% \begin{macrocode}
-\pst@def{SD}<%
- 0 360 arc fill>
-\pst@def{SQ}<%
- /r ED
- r r moveto
- r r neg L
- r neg r neg L
- r neg r L
- fill>
-\pst@def{ST}<%
- /y ED /x ED
- x y moveto
- x neg y L
- 0 x L
- fill>
-\pst@def{SP}<%
- /r ED
- gsave
- 0 r moveto
- 4 { 72 rotate 0 r L } repeat
- fill
- grestore>
-\@namedef{psds@*}{/Dot { 0 0 DS \tx@SD } def}
-\@namedef{psds@o}{%
- /r2 DS CLW sub def
- /Dot { 0 0 DS \tx@SD \pst@usecolor\psfillcolor 0 0 r2 \tx@SD } def}
-\@namedef{psds@square*}{%
- /r1 DS .886 mul def
- /Dot { r1 \tx@SQ } def}
-\@namedef{psds@square}{%
- /r1 DS .886 mul def /r2 r1 CLW sub def
- /Dot { r1 \tx@SQ \pst@usecolor\psfillcolor r2 \tx@SQ } def}
-\@namedef{psds@triangle*}{%
- /y1 DS .778 mul neg def /x1 y1 1.732 mul neg def
- /Dot { x1 y1 \tx@ST } def}
-\@namedef{psds@triangle}{%
- /y1 DS .778 mul neg def /x1 y1 1.732 mul neg def
- /y2 y1 CLW add def /x2 y2 1.732 mul neg def
- /Dot { x1 y1 \tx@ST \pst@usecolor\psfillcolor x2 y2 \tx@ST } def}
-\@namedef{psds@pentagon*}{%
- /r1 DS 1.149 mul def
- /Dot { r1 \tx@SP } def}
-\@namedef{psds@pentagon}{%
- DS .93 mul dup 1.236 mul /r1 ED CLW sub 1.236 mul /r2 ED
- /Dot { r1 \tx@SP \pst@usecolor\psfillcolor
- r2 \tx@SP } def}
-\@namedef{psds@+}{%
- /DS DS 1.253 mul def
- /Dot { DS 0 moveto DS neg 0 L stroke
- 0 DS moveto 0 DS neg L stroke } def}
-\@namedef{psds@|}{%
- \psk@tbarsize CLW mul add 2 div /DS ED
- /Dot { 0 DS moveto 0 DS neg L stroke } def}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{dotstyle}
-% \begin{macrocode}
-\def\psset@dotstyle#1{%
- \@ifundefined{psds@#1}%
- {\@pstrickserr{Dot style `#1' not defined}\@eha}%
- {\edef\psk@dotstyle{#1}}}
-\psset@dotstyle{*}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{NArray}
-% Syntax:
-% \begin{Ex}
-% <array of points> NArray <points>
-% \end{Ex}
-% Sets "n" to the number of pairs in the array, and makes sure there is an
-% even number of elements.
-% \begin{macrocode}
-\pst@def{NArray}<%
- aload length 2 div dup
- dup cvi eq not { exch pop } if
- /n exch cvi def>
-\pst@def{NArray}<%
- /f ED
- counttomark 2 div
- dup cvi /n ED
- n eq not { exch pop } if
- f
- { ] aload /Points ED }
- { n 2 mul 1 add -1 roll pop }
- ifelse>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{Line}
-% Syntax:
-% \begin{Ex}
-% <array of points> Line -
-% \end{Ex}
-% "ArrowA" and "ArrowB" should be defined to draw arrows, and "Lineto" should
-% be the procedure used to draw the path; either "lineto" or "Arcto".
-% \begin{macrocode}
-\pst@def{Line}<%
- \tx@NArray
- n 0 eq not
- { n 1 eq { 0 0 /n 2 def } if
- ArrowA
- /n n 2 sub def
- n { Lineto } repeat
- CP 4 2 roll ArrowB L
- pop pop }
- if>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{Arcto}
-% Syntax:
-% \begin{Ex}
-% <x2 y2 x1 y1> Arcto <x2 y2>
-% \end{Ex}
-% "r" should be set to the arc radius. Adds to the path with "arcto", with the
-% corner at <x1 y1> and going towards <x2 y2>. Works even when the points are
-% equal. For use with "Line" and "Polygon".
-% \begin{macrocode}
-\pst@def{Arcto}<%
- /a [ 6 -2 roll ] cvx def
- a r /arcto load stopped { 5 } { 4 } ifelse { pop } repeat a>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{Polygon}
-% Syntax:
-% \begin{Ex}
-% <array of points> Line -
-% \end{Ex}
-% "Lineto" should be the procedure used to draw the path; either "lineto" or
-% "Arcto".
-% \begin{macrocode}
-\pst@def{CheckClosed}<%
- dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq and
- { pop pop /n n 1 sub def }
- if>
-\pst@def{Polygon}<%
- \tx@NArray
- n 2 eq { 0 0 /n 3 def } if
- n 3 lt
- { n { pop pop } repeat }
- { n 3 gt { \tx@CheckClosed } if
- n 2 mul -2 roll /y0 ED /x0 ED
- /y1 ED /x1 ED x1 y1
- /x1 x0 x1 add 2 div def
- /y1 y0 y1 add 2 div def
- x1 y1 moveto
- /n n 2 sub def
- n { Lineto } repeat
- x1 y1 x0 y0 6 4 roll
- Lineto Lineto pop pop closepath }
- ifelse>
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Interpolated curves}
-%
-% This documentation is largely junk.
-%
-% There one was an alternate algorithm that had the nice property that when
-% the coordinates were scaled, the interpolated curve would scale in the same
-% way. It was also simpler. However, this one gives nicer looking results in
-% most cases.
-%
-% Two parameters should be defined:
-% \begin{description}
-% \item[a] Lower values make the curve tighter. (Default: 1)
-% \item[b] Higher values make the curve tighter where the angle ABC is less
-% than 45 degrees, and loosen the curve elsewhere. (Default: .1)
-% \end{description}
-% "ArrowA" and "ArrowB" should be defined as well.
-%
-% Each two points are connected by a single Bezier curve, using curveto. For
-% each point P, let P- and P+ be the control points before and after the
-% point. I.e., If A, B and C are consecutive points, then A and B are
-% connected by the Bezier curve with control points A, A+, B- and B, and B and
-% C are connected with control points B, B+, C- and C.
-%
-% The interpolation is local, meaning that control points B- and B+ depend
-% only on points A, B and C.
-%
-% \begin{macro}{\tx@CCA,\tx@CC}
-% The first three lines before "CCA" set "x1"$=Ax+$, "y1"$=Ay+$,
-% "l0"$=d(A,B)$, "dx0"$=Bx-Ax$, and "dy0"$=By-Ay$. After "CCA", "x"$=Bx$,
-% "y"$=By$, "dx1"$=Cx-Bx$, "dy2"$=Cy-By$, and "l1"$=d(B,C)$.
-% \begin{macrocode}
-\pst@def{CCA}<%
- /y ED /x ED 2 copy
- y sub /dy1 ED x sub /dx1 ED
- /l1 dx1 dy1 \tx@Pyth def>
-\pst@def{CCA}<%
- /y ED /x ED 2 copy
- y sub /dy1 ED x sub /dx1 ED
- /l1 dx1 dy1 \tx@Pyth def>
-\pst@def{CC}<%
- /l0 l1 def
- /x1 x dx sub def /y1 y dy sub def
- /dx0 dx1 def /dy0 dy1 def
- \tx@CCA
-% \end{macrocode}
-% The task is now to calculate $B-$ and $B+$. We first calculate the slope
-% "dx" and "dy" at $B$. This tangent at $B$ should be perpendicular to the
-% bisection of the angle $ABC$. Recalling that "dx0" and "dy0" ``point'' from
-% $A$ to $B$, this tangency thus passes through $B+(dx,dy)$, where $(dx,dy)$
-% is the average of $dx0,dy0$ and $dx1,dy1$, once these have been normalized
-% to have the same length. If we normalize by dividing each by their length,
-% and then multiplying both by both lengths, we get
-% \begin{center}\tt\begin{tabular}{rcl}
-% dx & $=$ & l1 $\times$ dx0 $+$ l0 $\times$ dx1 \\[3pt]
-% dy & $=$ & l1 $\times$ dy0 $+$ l0 $\times$ dy1
-% \end{tabular}\end{center}
-% \begin{macrocode}
- /dx dx0 l1 c exp mul dx1 l0 c exp mul add def
- /dy dy0 l1 c exp mul dy1 l0 c exp mul add def
-% \end{macrocode}
-% "dx" and "dy" give us the direction of the control points $B-$ and $B+$ from
-% $B$. Now we adjust the distance of these control points. The first component
-% is sine of the angle ABC, so that smaller angles give closer control points.
-% This is raised to the "b", so that "b" controls the extent of this
-% dependency (and can even reverse the relation).
-% Then this amount is multiplied times "a", which those adjusts the overall
-% tightness, independently of the angle. Let's call this amount $M$. This
-% amount is then divided by the length of the vector $(dx,dy)$, thereby
-% normalizing this vector to unit length, and then, multiplied times the
-% distance between $A$ and $B$ (for calculating $B-$). Thus, $B-$ is distance
-% $M d(A,B)$ from $B$. $(x2,y2)$ are set to $B-$, thus calculated, and $B+$ is
-% temporily stored in $(dx,dy)$.
-% \begin{macrocode}
- /m dx0 dy0 \tx@Atan dx1 dy1 \tx@Atan sub
- 2 div cos abs b exp a mul
- dx dy \tx@Pyth \tx@Div 2 div def
- /x2 x l0 dx mul m mul sub def
- /y2 y l0 dy mul m mul sub def
- /dx l1 dx mul m mul neg def
- /dy l1 dy mul m mul neg def>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@IC,\tx@BOC,\tx@NC,\tx@EOC,\tx@BAC,\tx@NAC,\tx@EAC}
-% These are the compenents of the loops that go through the lists of points
-% that are to be interpolated. These are abbreviations, as follows:
-% \begin{center}
-% \begin{tabular}{ll}
-% "IC" & Initialize Curve\\
-% "BOC" & Begin Open Curve\\
-% "NC" & Next Curve\\
-% "EOC" & End Open Curve\\
-% "BAC" & Begin Alternative Curve\\
-% "NAC" & Next Alternative Curve\\
-% "EAC" & End Alternative Curve
-% \end{tabular}
-% \end{center}
-% \begin{macrocode}
-\pst@def{IC}<%
- /c c 1 add def
- c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if } ifelse
- /a a 2 mul 3 div 45 cos b exp div def
- \tx@CCA /dx 0 def /dy 0 def>
-\pst@def{BOC}<%
- \tx@IC \tx@CC x2 y2 x1 y1 ArrowA
- CP 4 2 roll x y curveto>
-\pst@def{NC}<\tx@CC x1 y1 x2 y2 x y curveto>
-\pst@def{EOC}<%
- x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto>
-\pst@def{BAC}<%
- \tx@IC \tx@CC x y moveto \tx@CC
- x1 y1 CP ArrowA>
-\pst@def{NAC}<x2 y2 x y curveto \tx@CC x1 y1>
-\pst@def{EAC}<x2 y2 x y ArrowB curveto pop pop>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{OpenCurve}
-% Syntax:
-% \begin{Ex}
-% <array of points> OpenCurve
-% \end{Ex}
-% \begin{macrocode}
-\pst@def{OpenCurve}<%
- \tx@NArray
- n 3 lt
- { n { pop pop } repeat }
- { \tx@BOC
- /n n 3 sub def
- n { \tx@NC } repeat
- \tx@EOC }
- ifelse>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{AltCurve}
-% Syntax:
-% \begin{Ex}
-% <array of points> AltCurve
-% \end{Ex}
-% \begin{macrocode}
-\pst@def{AltCurve}<%
- { false \tx@NArray
- n 2 mul 2 roll
- [ n 2 mul 3 sub 1 roll ]
- aload /Points ED
- n 2 mul -2 roll }
- { false \tx@NArray }
- ifelse
- n 4 lt
- { n { pop pop } repeat }
- { \tx@BAC
- /n n 4 sub def
- n { \tx@NAC } repeat
- \tx@EAC }
- ifelse>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{ClosedCurve}
-% Syntax:
-% \begin{Ex}
-% <array of points> ClosedCurve
-% \end{Ex}
-% \begin{macrocode}
-\pst@def{ClosedCurve}<%
- \tx@NArray
- n 3 lt
- { n { pop pop } repeat }
- { n 3 gt { \tx@CheckClosed } if
- 6 copy n 2 mul 6 add 6 roll
- \tx@IC \tx@CC x y moveto
- n { \tx@NC } repeat
- closepath pop pop }
- ifelse>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{curvature}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pscurve}
-% \begin{macrocode}
-\def\pscurve{\def\pst@par{}\pst@object{pscurve}}
-\def\pscurve@i{%
- \pst@getarrows{%
- \begin@OpenObj
- \pst@getcoors[\pscurve@ii}}
-\def\pscurve@ii{%
- \addto@pscode{%
- \pst@cp
- \psk@curvature\space /c ED /b ED /a ED
- \ifshowpoints true \else false \fi
- \tx@OpenCurve}%
- \end@OpenObj}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psecurve}
-% \begin{macrocode}
-\def\psecurve{\def\pst@par{}\pst@object{psecurve}}
-\def\psecurve@i{%
- \pst@getarrows{%
- \begin@OpenObj
- \pst@getcoors[\psecurve@ii}}
-\def\psecurve@ii{%
- \addto@pscode{%
- \psk@curvature\space /c ED /b ED /a ED
- \ifshowpoints true \else false \fi
- \tx@AltCurve}%
- \end@OpenObj}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psccurve}
-% \begin{macrocode}
-\def\psccurve{\def\pst@par{}\pst@object{psccurve}}
-\def\psccurve@i{%
- \begin@ClosedObj
- \pst@getcoors[\psccurve@ii}
-\def\psccurve@ii{%
- \addto@pscode{%
- \psk@curvature\space /c ED /b ED /a ED
- \ifshowpoints true \else false \fi
- \tx@ClosedCurve}%
- \def\pst@linetype{1}%
- \end@ClosedObj}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Dots}
-%
-% It would be nice to use a font, with hinting.
-%
-% \begin{macro}{dotsize}
-% \begin{macrocode}
-\def\psset@dotsize#1{%
- \edef\pst@tempg{#1 }%
- \expandafter\psset@@dotsize\pst@tempg -1 -1 -1\@nil}
-\def\psset@@dotsize#1 #2 #3\@nil{%
- \pst@checknum{#2}\pst@tempg
- \pssetlength\pst@dimg{#1}%
- \edef\psk@dotsize{%
- /DS \pst@number\pst@dimg \pst@tempg CLW mul add 2 div def }}
-\psset@dotsize{.5pt 2.5}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psset@dotscale}
-% \begin{macrocode}
-\def\psset@dotscale#1{\pst@getscale{#1}\psk@dotscale}
-\psset@dotscale{1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@Getangle}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{dotangle}
-% \begin{macrocode}
-\def\psset@dotangle#1{\pst@Getangle{#1}\psk@dotangle}
-\psset@dotangle{0}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psdots}
-% \begin{macrocode}
-\def\psdots{\def\pst@par{}\pst@object{psdots}}
-\def\psdots@i{%
- \begin@SpecialObj
- \pst@getcoors[\psdots@ii}
-\def\psdots@ii{%
- \addto@pscode{false \tx@NArray \psdots@iii}%
- \end@SpecialObj}
-\def\psdots@iii{%
- \psk@dotsize
- \@nameuse{psds@\psk@dotstyle}
- newpath
- n { gsave T \psk@dotangle \psk@dotscale Dot grestore } repeat}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{EndDot}
-% Syntax
-% \begin{LVerbatim}
-% {<fill>} {<displace>} EndDot
-% \end{LVerbatim}
-% "DS" should be defined to be the dot size.
-% \begin{macrocode}
-\pst@def{EndDot}<%
- { /z DS def } { /z 0 def } ifelse
- /b ED
- 0 z DS \tx@SD
- b { 0 z DS CLW sub \tx@SD } if
- 0 DS z add CLW 4 div sub moveto>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@oo}
-% \begin{macrocode}
-\def\psas@oo{{\pst@usecolor\psfillcolor true} true \psk@dotsize \tx@EndDot}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@o}
-% \begin{macrocode}
-\def\psas@o{{\pst@usecolor\psfillcolor true} false \psk@dotsize \tx@EndDot}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@**}
-% \begin{macrocode}
-\@namedef{psas@**}{{false} true \psk@dotsize \tx@EndDot}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psas@*}
-% \begin{macrocode}
-\@namedef{psas@*}{{false} false \psk@dotsize \tx@EndDot}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Lines and polygons\label{Lines}}
-%
-% \begin{macro}{linearc}
-% \begin{macrocode}
-\newdimen\pslinearc
-\def\psset@linearc#1{\pssetlength\pslinearc{#1}}
-\psset@linearc{0pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psline}
-% \begin{macrocode}
-\def\psline{\def\pst@par{}\pst@object{psline}}
-\def\psline@i{%
- \pst@getarrows{%
- \begin@OpenObj
- \pst@getcoors[\psline@ii}}
-\def\psline@ii{%
- \addto@pscode{\pst@cp \psline@iii \tx@Line}%
- \end@OpenObj}
-\def\psline@iii{%
- \ifdim\pslinearc>\z@
- /r \pst@number\pslinearc def
- /Lineto { \tx@Arcto } def
- \else
- /Lineto /lineto load def
- \fi
- \ifshowpoints true \else false \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\qline}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pspolygon}
-% \begin{macrocode}
-\def\pspolygon{\def\pst@par{}\pst@object{pspolygon}}
-\def\pspolygon@i{%
- \begin@ClosedObj
- \def\pst@cp{}%
- \pst@getcoors[\pspolygon@ii}
-\def\pspolygon@ii{%
- \addto@pscode{\psline@iii \tx@Polygon}%
- \def\pst@linetype{1}%
- \end@ClosedObj}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{framearc}
-% \begin{macrocode}
-\def\psset@framearc#1{\pst@checknum{#1}\psk@framearc}
-\psset@framearc{0}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{cornersize}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{Frame}
-% Syntax
-% \begin{Ex}
-% <framearc/linearc bool x1 y1 x2 y2 dimen> "Frame"
-% \end{Ex}
-% \begin{macrocode}
-\pst@def{Rect}<%
- x1 y1 y2 add 2 div moveto
- x1 y2 lineto
- x2 y2 lineto
- x2 y1 lineto
- x1 y1 lineto
- closepath>
-\pst@def{OvalFrame}<%
- x1 x2 eq y1 y2 eq or
- { pop pop x1 y1 moveto x2 y2 L }
- { y1 y2 sub abs x1 x2 sub abs
- 2 copy gt { exch pop } { pop } ifelse
- 2 div
- exch % STACK: cornersize halfwidth boolean
- { dup 3 1 roll mul exch }
- if
- 2 copy lt { pop } { exch pop } ifelse
- /b ED
- x1 y1 y2 add 2 div moveto
- x1 y2 x2 y2 b arcto
- x2 y2 x2 y1 b arcto
- x2 y1 x1 y1 b arcto
- x1 y1 x1 y2 b arcto
- 16 { pop } repeat
- closepath }
- ifelse>
-\pst@def{Frame}<%
- CLW mul /a ED
- 3 -1 roll 2 copy gt { exch } if
- a sub /y2 ED a add /y1 ED
- 2 copy gt { exch } if
- a sub /x2 ED a add /x1 ED
- 1 index 0 eq { pop pop \tx@Rect } { \tx@OvalFrame } ifelse>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{dimen}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psframe}
-% \begin{macrocode}
-\def\psframe{\def\pst@par{}\pst@object{psframe}}
-\def\psframe@i(#1){%
- \@ifnextchar({\psframe@ii(#1)}{\psframe@ii(0,0)(#1)}}
-\def\psframe@ii(#1)(#2){%
- \begin@ClosedObj
- \pst@getcoor{#1}\pst@tempa
- \pst@@getcoor{#2}%
- \addto@pscode{\psk@cornersize \pst@tempa \pst@coor \psk@dimen \tx@Frame}%
- \def\pst@linetype{2}%
- \showpointsfalse
- \end@ClosedObj}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Curves}
-%
-% \begin{macro}{\psbezier}
-% \begin{macrocode}
-\def\psbezier{\def\pst@par{}\pst@object{psbezier}}
-\def\psbezier@i{\pst@getarrows\psbezier@ii}
-\def\psbezier@ii#1(#2)#3(#4)#5(#6){%
- \@ifnextchar({\psbezier@iii{1}(#2)(#4)(#6)}%
- {\psbezier@iii{\z@}(0,0)(#2)(#4)(#6)}}
-\def\psbezier@iii#1(#2)(#3)(#4)(#5){%
- \begin@OpenObj
- \pst@getcoor{#2}\pst@tempa
- \pst@getcoor{#3}\pst@tempb
- \pst@getcoor{#4}\pst@tempc
- \pst@getcoor{#5}\pst@tempd
- \pst@optcp{#1}\pst@tempa
- \ifshowpoints\psbezier@iv\fi
- \addto@pscode{
- \pst@tempb \pst@tempa ArrowA
- \pst@tempc \pst@tempd ArrowB
- curveto}%
- \end@OpenObj}
-\def\psbezier@iv{%
- \addto@pscode{%
- gsave
- \pst@tempa \pst@tempb \pst@tempc \pst@tempd
- newpath moveto L L L
- CLW 2 div SLW
- [ \psk@dash\space ] 0 setdash stroke
- grestore
- /Points [\pst@tempa\pst@tempb\pst@tempc\pst@tempd] def}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\parabola}
-% \begin{macrocode}
-\pst@def{Parab}<%
- /y0 exch def
- /x0 exch def
- /y1 exch def
- /x1 exch def
- /dx x0 x1 sub 3 div def
- /dy y0 y1 sub 3 div def
- x0 dx sub y0 dy add x1 y1 ArrowA
- x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB
- curveto
- /Points [ x1 y1 x0 y0 x0 2 mul x1 sub y1 ] def>
-\def\parabola{\def\pst@par{}\pst@object{parabola}}
-\def\parabola@i{\pst@getarrows\parabola@ii}
-\def\parabola@ii#1(#2)#3(#4){%
- \begin@OpenObj
- \pst@getcoor{#2}\pst@tempa
- \pst@@getcoor{#4}%
- \addto@pscode{\pst@tempa \pst@coor \tx@Parab}%
- \end@OpenObj}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Grids\label{Grids}}
-%
-% \begin{macro}{gridwidth}
-% \begin{macrocode}
-\def\psset@gridwidth#1{\pst@getlength{#1}\psk@gridwidth}
-\psset@gridwidth{.8pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{griddots}
-% \begin{macrocode}
-\def\psset@griddots#1{%
- \pst@cntg=#1\relax
- \edef\psk@griddots{\the\pst@cntg}}
-\psset@griddots{0}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{gridcolor}
-% \begin{macrocode}
-\def\psset@gridcolor#1{\pst@getcolor{#1}\psgridcolor}
-\psset@gridcolor{black}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{subgridwidth}
-% \begin{macrocode}
-\def\psset@subgridwidth#1{\pst@getlength{#1}\psk@subgridwidth}
-\psset@subgridwidth{.4pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{subgridcolor}
-% \begin{macrocode}
-\def\psset@subgridcolor#1{\pst@getcolor{#1}\pssubgridcolor}
-\psset@subgridcolor{gray}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{subgriddots}
-% \begin{macrocode}
-\def\psset@subgriddots#1{%
- \pst@cntg=#1\relax\edef\psk@subgriddots{\the\pst@cntg}}
-\psset@subgriddots{0}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{subgriddiv}
-% \begin{macrocode}
-\def\psset@subgriddiv#1{%
- \pst@cntg=#1\relax\edef\psk@subgriddiv{\the\pst@cntg}}
-\psset@subgriddiv{5}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{gridlabels}
-% \begin{macrocode}
-\def\psset@gridlabels#1{\pst@getlength{#1}\psk@gridlabels}
-\psset@gridlabels{10pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{gridlabelcolor}
-% \begin{macrocode}
-\def\psset@gridlabelcolor#1{\pst@getcolor{#1}\psgridlabelcolor}
-\psset@gridlabelcolor{black}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{Grid}
-% Syntax:
-% \begin{Ex}
-% <x1 y1 x2 y2 x-origin y-origin x-divsize y-divsize>\\
-% <numsubdiv griddots labelcolor labelsize> "Grid"
-% \end{Ex}
-% Coordinates should all be integers. Font needs to be defined before invoking
-% this procedure. This could probably be simplified.
-% \begin{macrocode}
-\pst@def{Grid}<%
- /a 4 string def % Empty string
- /b ED % Label size
- /d ED % Label color procedure.
- /n ED % Number of grid dots
- cvi dup 1 lt { pop 1 } if /c ED % Number subdivisions
- c div dup 0 eq { pop 1 } if /cy ED
- c div dup 0 eq { pop 1 } if /cx ED % division spacing
- cy div cvi /y ED % origin y
- cx div cvi /x ED % origin x
- cy div cvi /y2 ED % y2
- cx div cvi /x2 ED % x2
- cy div cvi /y1 ED % y1
- cx div cvi /x1 ED % x1
- /h y2 y1 sub 0 gt { 1 } { -1 } ifelse def % Sign of y2-y1
- /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def % Sign of x2-x1
- b 0 gt
- { /z1 b 4 div CLW 2 div add def
- /Helvetica findfont b scalefont setfont
- /b b .95 mul CLW 2 div add def }
- if
- gsave
- n 0 gt
- { 1 setlinecap [ 0 cy n div ] 0 setdash }
- { 2 setlinecap }
- ifelse
- /c x1 def /i 500 w mul x1 add def % Index
- /e y cy mul def /f y1 cy mul def /g y2 cy mul def
- x1 cx mul 0 T
- { newpath
- 0 e moveto
- b 0 gt
- { gsave d c a cvs dup
- stringwidth pop /z2 ED
- w 0 gt {z1} {z1 z2 add neg} ifelse
- h 0 gt {b neg} {z1} ifelse
- rmoveto show grestore } if
- 0 f moveto 0 g L stroke
- cx w mul 0 T
- c x2 eq c i eq or {exit} if
- /c c w add def
- } loop
- grestore
- gsave
- n 0 gt
- { 1 setlinecap [ 0 cx n div ] 0 setdash }
- { 2 setlinecap }
- ifelse
- /c y1 def /i 500 h mul y1 add def
- /e x cx mul def /f x1 cx mul def /g x2 cx mul def
- 0 y1 cy mul T
- { newpath
- e 0 moveto
- b 0 gt { gsave d
- c a cvs dup
- stringwidth pop /z2 ED
- w 0 gt {z1 z2 add neg} {z1} ifelse
- h 0 gt {z1} {b neg} ifelse
- rmoveto show grestore } if
- f 0 moveto g 0 L stroke
- 0 cy h mul T
- c y2 eq c i eq or {exit} if
- /c c h add def
- } loop
- grestore>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psgrid}
-% \begin{macrocode}
-\def\psgrid{\def\pst@par{}\pst@object{psgrid}}
-\def\psgrid@i{\@ifnextchar(%
- {\psgrid@ii}{\expandafter\psgrid@iv\pic@coor}}
-\def\psgrid@ii(#1){\@ifnextchar(%
- {\psgrid@iii(#1)}{\psgrid@iv(0,0)(0,0)(#1)}}
-\def\psgrid@iii(#1)(#2){\@ifnextchar(%
- {\psgrid@iv(#1)(#2)}{\psgrid@iv(#1)(#1)(#2)}}
-\def\psgrid@iv(#1)(#2)(#3){%
- \begin@SpecialObj
- \pst@getcoor{#1}\pst@tempa
- \pst@getcoor{#2}\pst@tempb
- \pst@@getcoor{#3}%
- \ifnum\psk@subgriddiv>1
- \addto@pscode{gsave
- \psk@subgridwidth SLW \pst@usecolor\pssubgridcolor
- \pst@tempb \pst@coor \pst@tempa
- \pst@number\psxunit \pst@number\psyunit
- \psk@subgriddiv\space \psk@subgriddots\space
- {} 0 \tx@Grid grestore}%
- \fi
- \addto@pscode{gsave
- \psk@gridwidth SLW \pst@usecolor\psgridcolor
- \pst@tempb \pst@coor \pst@tempa
- \pst@number\psxunit \pst@number\psyunit
- 1 \psk@griddots\space { \pst@usecolor\psgridlabelcolor }
- \psk@gridlabels \tx@Grid grestore}%
- \end@SpecialObj}
-% \end{macrocode}
-% \end{macro}
-%
-% \section{LR-box commands}
-%
-% \begin{macro}{\ifpsmathbox,\everypsbox}
-% \begin{macrocode}
-\newif\ifpsmathbox
-\psmathboxtrue
-\def\pst@mathflag{\z@}
-\newtoks\everypsbox
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@makenotverbbox}
-% \begin{macrocode}
-\long\def\pst@makenotverbbox#1#2{%
- \edef\pst@mathflag{%
- \ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else \z@\fi\else \z@\fi}%
- \setbox\pst@hbox=\hbox{%
- \ifcase\pst@mathflag\or$\m@th\textstyle\or$\m@th\displaystyle\fi
- {\the\everypsbox#2}%
- \ifnum\pst@mathflag>\z@$\fi}%
- #1}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@makeverbbox}
-% There is no way to do this such that with
-% \begin{LVerbatim}
-% \psframebox{\aftergroup\foo}
-% \end{LVerbatim}
-% "\foo" does not end up outside the box. That is why this is not the default
-% mode.
-% \begin{macrocode}
-\def\pst@makeverbbox#1{%
- \def\pst@afterbox{#1}%
- \edef\pst@mathflag{%
- \ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else \z@\fi\else \z@\fi}%
- \afterassignment\pst@beginbox
- \setbox\pst@hbox\hbox}
-\def\pst@beginbox{%
- \ifcase\pst@mathflag\or$\m@th\or$\m@th\displaystyle\fi
- \bgroup\aftergroup\pst@endbox
- \the\everypsbox}
-\def\pst@endbox{%
- \ifnum\pst@mathflag>\z@$\fi
- \egroup
- \pst@afterbox}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psverbboxtrue,\psverbboxfalse}
-% \begin{macrocode}
-\def\pst@makebox{\pst@@makebox}
-\def\psverbboxtrue{\def\pst@@makebox{\pst@makeverbbox}}
-\def\psverbboxfalse{\def\pst@@makebox{\pst@makenotverbbox}}
-\psverbboxfalse
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@longbox,\pst@makelongbox}
-% There is no way to do this such that with
-% \begin{LVerbatim}
-% \psframebox{\aftergroup\foo}
-% \end{LVerbatim}
-% "\foo" does not end up outside the box. That is why this is not the default
-% mode.
-% \begin{macrocode}
-\def\pst@longbox{%
- \def\pst@makebox{%
- \gdef\pst@makebox{\pst@@makebox}%
- \pst@makelongbox}}
-\def\pst@makelongbox#1{%
- \def\pst@afterbox{#1}%
- \edef\pst@mathflag{%
- \ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else \z@\fi\else \z@\fi}%
- \setbox\pst@hbox\hbox\bgroup
- \aftergroup\pst@afterbox
- \ifcase\pst@mathflag\or$\m@th\or$\m@th\displaystyle\fi
- \begingroup
- \the\everypsbox}
-\def\pst@endlongbox{%
- \endgroup
- \ifnum\pst@mathflag>\z@$\fi
- \egroup}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pslongbox}
-% \begin{macrocode}
-\def\pslongbox#1#2{%
- \@namedef{#1}{\pst@longbox#2}%
- \@namedef{end#1}{\pst@endlongbox}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Frame boxes\label{Frameboxes}}
-%
-% \begin{macro}{framesep}
-% \begin{macrocode}
-\newdimen\psframesep
-\def\psset@framesep#1{\pssetlength\psframesep{#1}}
-\psset@framesep{3pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{boxsep}
-% \begin{macrocode}
-\newif\ifpsboxsep
-\def\psset@boxsep#1{\@nameuse{psboxsep#1}}
-\psset@boxsep{true}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@useboxpar}
-% \begin{macrocode}
-\def\pst@useboxpar{%
- \use@par
- \if@star
- \let\pslinecolor\psfillcolor
- \solid@star
- \let\solid@star\relax
- \fi
- \ifpsdoubleline \pst@setdoublesep \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psframebox}
-% "\psframebox" puts its argument in an "\hbox" and draws a frame around it
-% with thickness "\pst@linewidth", and with distance "\pst@framesep" between
-% each side of the frame (between the line making up each side) and each side
-% of the box. The result is a box with no depth and with width and height
-% equal to the width and height of the original box, plus
-% 2("\pslinewidth"+"\psframesep").
-%
-% "\pst@dima" is set to the distance between each side of the original box and
-% the outer side of the frame (i.e., the side of the resulting box).
-% "\pst@dimb" is set to the depth of the resulting box, "\pst@dimc" is set to
-% the height plus depth of this box, and "\pst@dimd" is set to the width.
-% "\psframe" does the drawing of the frame.
-% \begin{macrocode}
-\def\psframebox{\def\pst@par{}\pst@object{psframebox}}
-\def\psframebox@i{\pst@makebox\psframebox@ii}
-\def\psframebox@ii{%
- \begingroup
- \pst@useboxpar
- \pst@dima=\pslinewidth
- \advance\pst@dima by \psframesep
- \pst@dimc=\wd\pst@hbox\advance\pst@dimc by \pst@dima
- \pst@dimb=\dp\pst@hbox\advance\pst@dimb by \pst@dima
- \pst@dimd=\ht\pst@hbox\advance\pst@dimd by \pst@dima
- \setbox\pst@hbox=\hbox{%
- \ifpsboxsep\kern\pst@dima\fi
- \begin@ClosedObj
- \addto@pscode{%
- \psk@cornersize
- \pst@number\pst@dima neg
- \pst@number\pst@dimb neg
- \pst@number\pst@dimc
- \pst@number\pst@dimd
- .5
- \tx@Frame}%
- \def\pst@linetype{2}%
- \showpointsfalse
- \end@ClosedObj
- \box\pst@hbox
- \ifpsboxsep\kern\pst@dima\fi}%
- \ifpsboxsep\dp\pst@hbox=\pst@dimb\ht\pst@hbox=\pst@dimd\fi
- \leavevmode\box\pst@hbox
- \endgroup}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psdblframebox}
-% \begin{macrocode}
-\def\psdblframebox{\def\pst@par{}\pst@object{psdblframebox}}
-\def\psdblframebox@i{\addto@par{doubleline=true}\psframebox@i}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psclip,\endclip}
-% Clipping involves drawing graphics objects, not grouped by "gsave" and
-% "grestore", which may affect the graphics environment. Furthermore, to reset
-% the clipping path, we must either use "grestore" or "initclip", neither of
-% which is robust.
-% \begin{macrocode}
-\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}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psclipbox}
-% \begin{macrocode}
-\def\clipbox{\@ifnextchar[{\psclipbox@}{psclipbox@[\z@]}}
-\def\clipbox@[#1]{\pst@makebox\psclipbox@@{#1}}
-\def\clipbox@@#1{%
- \pssetlength\pst@dimg{#1}%
- \leavevmode\hbox{%
- \begin@psclip
- \pst@Verb{%
- CM \tx@STV CP T newpath
- /a \pst@number\pst@dimg def
- /w \pst@number{\wd\pst@hbox}a add def
- /d \pst@number{\dp\pst@hbox}a add neg def
- /h \pst@number{\ht\pst@hbox}a add def
- a neg d moveto
- a neg h L
- w h L
- w d L
- closepath
- clip
- newpath
- 0 0 moveto
- setmatrix}%
- \unhbox\pst@hbox
- \end@psclip}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psshadowbox}
-% \begin{macrocode}
-\def\psshadowbox{%
- \def\pst@par{}\pst@object{psshadowbox}}
-\def\psshadowbox@i{\pst@makebox\psshadowbox@ii}
-\def\psshadowbox@ii{%
- \begingroup
- \pst@useboxpar
- \psshadowtrue
- \psboxseptrue
- \def\psk@shadowangle{-45 }%
- \setbox\pst@hbox=\hbox{\psframebox@ii}%
- \pst@dimh=\psk@shadowsize\p@
- \pst@dimh=.7071\pst@dimh
- \pst@dimg=\dp\pst@hbox
- \advance\pst@dimg\pst@dimh
- \dp\pst@hbox=\pst@dimg
- \pst@dimg=\wd\pst@hbox
- \advance\pst@dimg\pst@dimh
- \wd\pst@hbox=\pst@dimg
- \leavevmode
- \box\pst@hbox
- \endgroup}
-%
-%
-% \begin{macro}{\pscirclebox}
-% "\pscirclebox@ii"'s argument is a hook that is used by node commands.
-% \begin{macrocode}
-\def\pscirclebox{\def\pst@par{}\pst@object{pscirclebox}}
-\def\pscirclebox@i{\pst@makebox{\pscirclebox@ii{}}}
-\def\pscirclebox@ii#1{%
- \begingroup
- \pst@useboxpar
- \setbox\pst@hbox=\hbox{#1\pscirclebox@iii\box\pst@hbox}%
- \ifpsboxsep
- \pst@dima=.5\wd\pst@hbox
- \pst@pyth\pst@dima\pst@dimb\pst@dimc
- \advance\pst@dimc\pslinewidth
- \advance\pst@dimc\psframesep
- \setbox\pst@hbox=\hbox to2\pst@dimc{%
- \hss
- \vbox{\vskip\pst@dimc\vskip-\pst@dimb\box\pst@hbox}%
- \hss}%
- \advance\pst@dimc-\pst@dimb
- \dp\pst@hbox=\pst@dimc
- \fi
- \leavevmode\box\pst@hbox
- \endgroup}
-\def\pscirclebox@iii{%
- \if@star
- \pslinewidth\z@
- \pstverb{\pst@dict \tx@STP \pst@usecolor\psfillcolor
- newpath \pscirclebox@iv \tx@SD end}%
- \else
- \begin@ClosedObj
- \def\pst@linetype{4}\showpointsfalse
- \addto@pscode{%
- \pscirclebox@iv CLW 2 div add 0 360 arc closepath}%
- \end@ClosedObj
- \fi}
-\def\pscirclebox@iv{%
- \pst@number{\wd\pst@hbox}2 div
- \pst@number{\ht\pst@hbox}\pst@number{\dp\pst@hbox}add 2 div
- 2 copy \pst@number{\dp\pst@hbox}sub 4 2 roll
- \tx@Pyth \pst@number\psframesep add }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psovalbox}
-% The argument of "\psovalbox@ii" is a hook used by node commands.
-% \begin{macrocode}
-\def\psovalbox{\def\pst@par{}\pst@object{psovalbox}}
-\def\psovalbox@i{\pst@makebox{\psovalbox@ii{}}}
-\def\psovalbox@ii#1{%
- \begingroup
- \pst@useboxpar
- \pst@dimd=.707\pslinewidth\advance\pst@dimd by 1.414\psframesep
- \pst@dimg=\ht\pst@hbox\advance\pst@dimg\dp\pst@hbox
- \pst@dimb=.707\pst@dimg\advance\pst@dimb\pst@dimd
- \pst@dima=.707\wd\pst@hbox\advance\pst@dima\pst@dimd
- \setbox\pst@hbox=\hbox{#1\psovalbox@iii\box\pst@hbox}%
- \ifpsboxsep
- \setbox\pst@hbox\hbox to 2\pst@dima{\hss\unhbox\pst@hbox\hss}%
- \advance\pst@dimb-.5\pst@dimg
- \pst@dimg\ht\pst@hbox
- \advance\pst@dimg\pst@dimb
- \ht\pst@hbox=\pst@dimb
- \pst@dimg=\dp\pst@hbox
- \advance\pst@dimg\pst@dimb
- \dp\pst@hbox=\pst@dimb
- \fi
- \leavevmode\box\pst@hbox
- \endgroup}
-\def\psovalbox@iii{%
- \begin@ClosedObj
- \addto@pscode{%
- 0 360
- \pst@number\pst@dima \pst@number\pst@dimb
- \pst@number{\wd\pst@hbox}2 div
- \pst@number\pst@dimg 2 div \pst@number{\dp\pst@hbox}sub
- \tx@Ellipse
- closepath}%
- \def\pst@linetype{2}%
- \end@ClosedObj}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Circles, discs and ellipses\label{Circles}}
-%
-%
-% \begin{macro}{\psset@arcsep,\psk@arcsepA,\psk@arcsepB}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@Arc}
-% Syntax:
-% \begin{LVerbatim}
-% <angle> {<arrow>} {<add/sub>} ArcArrow <angle>
-% \end{LVerbatim}
-% "r"=radius and "c"=57.2957/"r" should also be defined.
-% \begin{macrocode}
-\pst@def{ArcArrow}<%
- /d ED % add/sub
- /b ED % arrow procedure
- /a ED % angle
- gsave
- newpath
- 0 -1000 moveto
- clip % Set clippath far from arrow.
- newpath
- 0 1 0 0 b % Draw arrow to determine length.
- grestore
- c mul
- /e ED % /e equals angle to adjust for arrow length.
- pop pop pop
- r a e d \tx@PtoC % `a e d' is end angle for arrow.
- y add exch x add exch
- r a \tx@PtoC % Now arrow end coor and begin coor are on stack.
- y add exch x add exch
- b pop pop pop pop % Draw arrow, and discard coordinates.
- a e d % End angle of arrow.
- CLW 8 div c mul neg d> % Adjust angle to give a little overlap.
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psarc}
-% \begin{macrocode}
-\def\psarc{\def\pst@par{}\pst@object{psarc}}
-\def\psarc@i{%
- \@ifnextchar({\psarc@iii}{\psarc@ii}}
-\def\psarc@ii#1{\addto@par{arrows=#1}%
- \@ifnextchar({\psarc@iii}{\psarc@iii(0,0)}}
-\def\psarc@iii(#1)#2#3#4{%
- \begin@OpenObj
- \pst@getangle{#3}\pst@tempa
- \pst@getangle{#4}\pst@tempb
- \pst@@getcoor{#1}%
- \pssetlength\pst@dima{#2}%
- \addto@pscode{\psarc@iv \psarc@v}%
- \gdef\psarc@type{0}%
- \showpointsfalse
- \end@OpenObj}
-\def\psarc@iv{%
- \pst@coor /y ED /x ED
- /r \pst@number\pst@dima def
- /c 57.2957 r \tx@Div def
- /angleA
- \pst@tempa
- \psk@arcsepA c mul 2 div
- \ifcase \psarc@type add \or sub \fi
- def
- /angleB
- \pst@tempb
- \psk@arcsepB c mul 2 div
- \ifcase \psarc@type sub \or add \fi
- def
- \ifshowpoints\psarc@showpoints\fi
- \ifx\psk@arrowA\@empty
- \ifnum\psk@liftpen=2
- r angleA \tx@PtoC
- y add exch x add exch
- moveto
- \fi
- \fi}
-\def\psarc@v{%
- x y r
- angleA
- \ifx\psk@arrowA\@empty\else
- { ArrowA CP }
- { \ifcase\psarc@type add \or sub \fi }
- \tx@ArcArrow
- \fi
- angleB
- \ifx\psk@arrowB\@empty\else
- { ArrowB }
- { \ifcase\psarc@type sub \or add \fi }
- \tx@ArcArrow
- \fi
- \ifcase\psarc@type arc \or arcn \fi}
-\def\psarc@type{0}
-\def\psarc@showpoints{%
- gsave
- newpath
- x y moveto
- x y r \pst@tempa \pst@tempb
- \ifcase\psarc@type arc \or arcn \fi
- closepath
- CLW 2 div SLW
- [ \psk@dash\space ] 0 setdash stroke
- grestore }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psarcn}
-% \begin{macrocode}
-\def\psarcn{\def\pst@par{}\pst@object{psarcn}}
-\def\psarcn@i{\def\psarc@type{1}\psarc@i}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pscircle}
-% \begin{macrocode}
-\def\pscircle{\def\pst@par{}\pst@object{pscircle}}
-\def\pscircle@i{\@ifnextchar({\pscircle@do}{\pscircle@do(0,0)}}
-\def\pscircle@do(#1)#2{%
- \if@star
- {\use@par\qdisk(#1){#2}}%
- \else
- \begin@ClosedObj
- \pst@@getcoor{#1}%
- \pssetlength\pst@dimc{#2}%
- \def\pst@linetype{4}%
- \addto@pscode{%
- \pst@coor
- \pst@number\pst@dimc
- \psk@dimen CLW mul sub
- 0 360 arc
- closepath}%
- \showpointsfalse
- \end@ClosedObj
- \fi
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\qdisk}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pswedge}
-% \begin{macrocode}
-\def\pswedge{\def\pst@par{}\pst@object{pswedge}}
-\def\pswedge@i{\@ifnextchar({\pswedge@ii}{\pswedge@ii(0,0)}}
-\def\pswedge@ii(#1)#2#3#4{%
- \begin@ClosedObj
- \pssetlength\pst@dimc{#2}
- \pst@getangle{#3}\pst@tempa
- \pst@getangle{#4}\pst@tempb
- \pst@@getcoor{#1}%
- \def\pst@linetype{1}%
- \addto@pscode{%
- \pst@coor
- 2 copy
- moveto
- \pst@number\pst@dimc \psk@dimen CLW mul sub % Adjusted radius
- \pst@tempa \pst@tempb
- arc
- closepath}%
- \showpointsfalse
- \end@ClosedObj}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{Ellipse}
-% Syntax:
-% \begin{Ex}
-% <angle1 angle2 x-radius y-radius x-origin y-origin> "Ellipse"
-% \end{Ex}
-% \begin{macrocode}
-\pst@def{Ellipse}<%
- /mtrx CM def
- T
- scale
- 0 0 1 5 3 roll arc
- mtrx setmatrix>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\psellipse}
-% \begin{macrocode}
-\def\psellipse{\def\pst@par{}\pst@object{psellipse}}
-\def\psellipse@i(#1){\@ifnextchar(%
- {\psellipse@ii(#1)}{\psellipse@ii(0,0)(#1)}}
-\def\psellipse@ii(#1)(#2){%
- \begin@ClosedObj
- \pst@getcoor{#1}\pst@tempa
- \pst@@getcoor{#2}%
- \addto@pscode{%
- 0 360
- \pst@coor
- \ifdim\psk@dimen\p@=\z@\else
- \psk@dimen CLW mul dup 3 1 roll
- sub 3 1 roll sub exch
- \fi
- \pst@tempa
- \tx@Ellipse
- closepath}%
- \def\pst@linetype{2}%
- \end@ClosedObj}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Repetition}
-%
-% \begin{macro}{\multirput}
-% \begin{macrocode}
-\def\multirput{%
- \begingroup\pst@getref{\pst@getrputrot\multirput@i}}
-\def\multirput@i(#1){\@ifnextchar(%
- {\multirput@ii(#1)}{\multirput@ii(0,0)(#1)}}
-\def\multirput@ii(#1,#2)(#3,#4)#5{%
- \pst@makebox{\multirput@iii(#1,#2)(#3,#4){#5}}}
-\def\multirput@iii(#1,#2)(#3,#4)#5{%
- \pst@makesmall\pst@hbox
- \ifx\pst@rot\@empty\else\pst@rotate\pst@hbox\fi
- \pssetxlength\pst@dima{#1}\pssetylength\pst@dimb{#2}
- \pssetxlength\pst@dimc{#3}\pssetylength\pst@dimd{#4}
- \pst@cntg=#5\relax\pst@cnth=0\relax
- \leavevmode
- \loop\ifnum\pst@cntg>\pst@cnth
- \vbox to \z@{\vss\hbox to \z@{%
- \kern\pst@dima\copy\pst@hbox\hss}\vskip\pst@dimb}%
- \advance\pst@dima by\pst@dimc
- \advance\pst@dimb by\pst@dimd
- \advance\pst@cnth by 1
- \repeat
- \endgroup\ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\multips}
-% \begin{macrocode}
-\def\multips{\begingroup\pst@getrputrot\multips@i}
-\def\multips@i(#1){\@ifnextchar({\@multips@ii(#1)}{\@multips@ii(0,0)(#1)}}
-\def\@multips@ii(#1)(#2)#3#4{%
- \pst@getcoor{#1}\pst@tempa
- \pst@@getcoor{#2}%
- \pst@cnta=#3\relax
- \addto@pscode{%
- \pst@tempa T \the\pst@cnta\space \pslbrace
- gsave \ifx\pst@rot\@empty\else\pst@rot rotate \fi }%
- \hbox to\z@{%
- \def\init@pscode{%
- \addto@pscode{%
- gsave
- \pst@number\pslinewidth SLW
- \pst@usecolor\pslinecolor}}%
- \def\use@pscode{\addto@pscode{grestore}}%
- \def\psclip##1{\pst@misplaced\psclip}%
- \def\nc@object##1##2##3##4{\pst@misplaced{node connection}}%
- #4}%
- \addto@pscode{grestore \pst@coor T \psrbrace repeat}%
- \leavevmode
- \use@pscode
- \endgroup
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Scaling\label{Scaling}}
-%
-% \begin{macro}{\scalebox}
-% \begin{macrocode}
-\def\scalebox#1{%
- \begingroup
- \pst@getscale{#1}\pst@tempa
- \pst@makebox{\@scalebox}}
-\def\@scalebox{%
- \leavevmode
- \ifx\pst@tempa\@empty
- \box\pst@hbox
- \else
- \hbox{%
- \ht\pst@hbox=\pst@temph\ht\pst@hbox%
- \dp\pst@hbox=\pst@temph\dp\pst@hbox%
- \pst@dima=\pst@tempg\wd\pst@hbox%
- \ifdim\pst@dima<\z@\kern-\pst@dima\fi
- \pst@Verb{CP CP T \pst@tempa \tx@NET}%
- \hbox to \z@{\box\pst@hbox\hss}%
- \pst@Verb{%
- CP CP T
- 1 \pst@tempg\space div 1 \pst@temph\space div scale
- \tx@NET}%
- \ifdim\pst@dima>\z@\kern\pst@dima\fi}%
- \fi
- \endgroup}
-\pslongbox{Scalebox}{\scalebox}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\scaleboxto}
-% \begin{macrocode}
-\def\scaleboxto(#1,#2){%
- \begingroup
- \pssetlength\pst@dima{#1}%
- \pssetlength\pst@dimb{#2}%
- \pst@makebox{\@scaleboxto\@scalebox}}
-\def\@scaleboxto{%
- \ifdim\pst@dima=\z@\else
- \pst@divide{\pst@dima}{\wd\pst@hbox}\pst@tempg
- \fi
- \ifdim\pst@dimb=\z@
- \let\pst@temph\pst@tempg
- \else
- \pst@dimc=\ht\pst@hbox\advance\pst@dimc\dp\pst@hbox
- \pst@divide{\pst@dimb}{\pst@dimc}\pst@temph
- \ifdim\pst@dima=\z@\let\pst@tempg\pst@temph\fi
- \fi
- \edef\pst@tempa{\pst@tempg\space\pst@temph\space scale }%
- \ifdim\pst@dima=\z@
- \ifdim\pst@dimb=\z@
- \@pstrickserr{%
- \string\scaleboxto\space dimensions cannot both be zero}\@ehpa
- \def\pst@tempa{}%
- \fi\fi}
-\pslongbox{Scaleboxto}{\scaleboxto}
-% \end{macrocode}
-% \end{macro}
-%
-% \section{Rotation: The simple version\label{Rotation:simple}}
-%
-% \begin{macro}{\tx@Rot}
-% \begin{macrocode}
-\pst@def{Rot}<\pstrotate>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rotateleft,\rotateright,\rotatedown}
-% These are pretty standard, except that they do not use "gsave" and
-% "grestore".
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{{\tt\Backslash rput} and company}
-%
-% \n\rput\ and similar commands are divided into fours steps:
-% \begin{enumerate}
-% \item The four arguments are collected:
-% \begin{enumerate}
-% \item The reference point argument is stored in \n\refpoint@x\ and
-% \n\refpoint@y.
-% \item The rotation angle is store in \n\pst@rot.
-% \item The translation coordinate is passed to the command that is returned
-% to after the box is made.
-% \item The RH-box is assigned to the register \n\pst@hbox.
-% \end{enumerate}
-% \item The box is made zero-dimension and positioned at the reference point
-% by \n\pst@makesmall.
-% \item The box is rotated by \n\pst@rotate.
-% \item The box is translated by \n\psput@.
-% \end{enumerate}
-%
-% \subsection{Reference point}
-%
-% \begin{macro}{\pst@getref}
-% \begin{macrocode}
-\def\pst@getref#1{%
- \@ifnextchar[%
- {\def\refpoint@x{.5}\def\refpoint@y{.5}\pst@@getref{#1}}%
- {\let\refpoint@x\relax#1}}
-\def\pst@@getref#1[#2]{%
- \pst@expandafter\pst@@@getref{#2}\@empty,,\@nil#1}
-\def\pst@@@getref#1#2,#3,#4\@nil{%
- \ifx\@empty#3\@empty
- \@nameuse{getref@#1}\@nameuse{getref@#2}%
- \else
- \pst@checknum{#1#2}\refpoint@x
- \pst@checknum{#3}\refpoint@y
- \fi}
-\def\getref@t{\def\refpoint@y{1}}
-\def\getref@b{\def\refpoint@y{0}}
-\def\getref@B{\let\refpoint@y\relax}
-\def\getref@l{\def\refpoint@x{0}}
-\def\getref@r{\def\refpoint@x{1}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@makesmall}
-% \begin{macrocode}
-\def\pst@makesmall#1{%
- \ifx\refpoint@x\relax
- \setbox#1=\hbox to\z@{\hss\vbox to \z@{\vss\box#1\vss}\hss}%
- \else
- \pst@@makesmall{#1}%
- \fi}
-\def\pst@@makesmall#1{%
- \pst@dimh=\refpoint@x\wd#1%
- \ifx\refpoint@y\relax
- \pst@dimg=\dp#1%
- \else
- \pst@dimg=\refpoint@y\ht#1%
- \advance\pst@dimg\refpoint@y\dp#1%
- \fi
- \setbox#1=\hbox to\z@{%
- \hskip-\pst@dimh\vbox to\z@{\vss\box#1\vskip-\pst@dimg}\hss}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Rotation}
-%
-% \begin{macro}{\pst@getrputrot}
-% \begin{macrocode}
-\def\pst@getrputrot#1{%
- \@ifnextchar(%
- {\def\pst@rot{}#1}%
- {\pst@getrot{\@ifnextchar({#1}{#1(0,0)}}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getrot}
-% \begin{macrocode}
-\def\pst@getrot#1#2{%
- \pst@expandafter{\@ifnextchar*{\pst@@@getrot}{\pst@@getrot}}{#2}\@nil
- \ifx\pst@rotlist\@empty\else
- \edef\pst@rotlist{\pst@rotlist \pst@rot add }%
- \fi
- #1}
-\def\pst@@getrot#1\@nil{%
- \def\next##1@#1=##2@##3\@nil{%
- \ifx\relax##2%
- \pst@getangle{#1}\pst@rot
- \else
- \def\pst@rot{##2}%
- \fi}%
- \expandafter\next\pst@rottable @#1=\relax @\@nil}
-\def\pst@@@getrot#1#2\@nil{%
- \pst@@getrot#2\@nil
- \edef\pst@rot{\pst@rotlist neg \ifx\pst@rot\@empty\else\pst@rot add \fi}}%
-\def\pst@rotlist{0 }
-\def\pst@rot{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@rottable}
-% The trailing spaces must be included, except when empty.
-% \begin{macrocode}
-\def\pst@rottable{%
- @0=%
- @U=%
- @L=90 %
- @D=180 %
- @R=-90 %
- @N=\pst@rotlist neg %
- @W=\pst@rotlist neg 90 add %
- @S=\pst@rotlist neg 180 add %
- @E=\pst@rotlist neg 90 sub }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@rotate}
-% The last argument should be the register for a zero-dimensional box that is
-% to be rotated. By first putting the box in a zero-dimension box centered at
-% the reference point of the original box, we do not have to use "gsave" and
-% "grestore".
-% \begin{macrocode}
-\def\pst@rotate#1{%
- \setbox#1=\hbox{%
- \pst@Verb{\pst@rot \tx@Rot}%
- \box#1%
- \pst@Verb{\pst@rot neg \tx@Rot}}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Translation}
-%
-% \begin{macro}{\psput@cartesian,\psput@special}
-% \n\psput@\ is defined by the \n\NormalCoor\ and \n\SpecialCoor\ commands to
-% invoke either "\psput@cartesian" or "\psput@special".
-%
-% "\psput@cartesian" is for Cartesian coordinates only. \TeX\ does the
-% translation.
-%
-% "\psput@special" works for any coordinates. PostScript does the translation.
-% "/lmtrx" is used to store a stack of transformation for nested translations.
-% \begin{macrocode}
-\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}}}
-\pst@def{PutCoor}<%
- gsave
- CP T
- CM
- \tx@STV
- exch exec
- moveto
- setmatrix
- CP
- grestore>
-\pst@def{PutBegin}<%
- /lmtrx [ tx@Dict /lmtrx known { lmtrx aload pop } if CM ] def
- CP 4 2 roll T moveto>
-\pst@def{PutEnd}<CP /lmtrx [ lmtrx aload pop setmatrix ] def moveto>
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{The real thing}
-%
-% \begin{macro}{\begin@psput,\end@psput}
-% \begin{macrocode}
-\def\begin@psput#1{\begingroup\pst@killglue\leavevmode\pst@ifstar{#1}}%
-\def\end@psput#1(#2){%
- \pst@makebox{%
- \if@star
- \setbox\pst@hbox\hbox{\psframebox*[boxsep=false]{\unhbox\pst@hbox}}%
- \fi
- #1(#2)%
- \endgroup
- \ignorespaces}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\rput}
-% \begin{macrocode}
-\def\rput{\begin@psput{\pst@getref{\pst@getrputrot{\end@psput\rput@i}}}}
-\def\rput@i(#1){%
- \pst@makesmall\pst@hbox
- \ifx\pst@rot\@empty\else\pst@rotate\pst@hbox\fi
- \psput@{#1}\pst@hbox}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\cput}
-% The first argument of "\cput@iii" is a hook used by node commands.
-% \begin{macrocode}
-\def\cput{\def\pst@par{}\pst@object{cput}}
-\def\cput@i{\begingroup\pst@killglue\leavevmode\pst@getrputrot\cput@ii}
-\def\cput@ii(#1){\pst@makebox{\cput@iii{}(#1)}}
-\def\cput@iii#1(#2){%
- \setbox\pst@hbox=\hbox{\psboxsepfalse\pscirclebox@ii{#1}}%
- \let\refpoint@x\relax
- \rput@i(#2)%
- \endgroup
- \ignorespaces}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{{\tt\Backslash uput} and company}
-%
-% The difference between "\uput" and \n\rput\ is that "\rput"'s reference
-% point is replaced by labelsep and reference angle arguments.
-%
-% \begin{macro}{\psset@labelsep,\pslabelsep}
-% \begin{macrocode}
-\newdimen\pslabelsep
-\def\psset@labelsep#1{\pssetlength\pslabelsep{#1}}
-\psset@labelsep{5pt}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getrefangle}
-% \begin{macrocode}
-\def\pst@getrefangle#1\@nil{%
- \def\next##1@#1=##2"##3@##4\@nil{%
- \ifx\relax##2%
- \pst@getangle{#1}\pst@refangle
- \def\pst@uputref{}%
- \else
- \edef\pst@refangle{##2}%
- \edef\pst@uputref{##3}%
- \fi}%
- \expandafter\next\pst@refangletable @#1=\relax"@\@nil}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@refangletable}
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\uput}
-% \begin{macrocode}
-\def\uput{\begin@psput{\@ifnextchar[{\uput@ii}{\uput@i}}}
-\def\uput@i#1{\pssetlength\pslabelsep{#1}\uput@ii}
-\def\uput@ii[#1]{%
- \pst@expandafter\pst@getrefangle{#1}\@nil
- \pst@getrputrot{\end@psput\uput@iii}}
-\def\uput@iii(#1){%
- \ifx\pst@uputref\@empty
- \uput@iv\tx@UUput
- \else
- \ifx\pst@rot\@empty
- \expandafter\uput@v\pst@uputref
- \else
- \uput@iv\tx@UUput
- \fi
- \fi
- \psput@{#1}\pst@hbox}
-\def\uput@iv#1{%
- \edef\pst@coor{%
- \pst@number\pslabelsep
- \pst@number{\wd\pst@hbox}%
- \pst@number{\ht\pst@hbox}%
- \pst@number{\dp\pst@hbox}%
- \pst@refangle\space \ifx\pst@rot\@empty\else\pst@rot\space sub \fi
- \tx@Uput #1}%
- \setbox\pst@hbox=\hbox to\z@{\hss\vbox to\z@{\vss\box\pst@hbox\vss}\hss}%
- \setbox\pst@hbox=\psput@special\pst@hbox
- \ifx\pst@rot\@empty\else\pst@rotate\pst@hbox\fi}
-\def\uput@v#1#2{%
- \ifnum#1>\z@\ifnum#2>\z@\pslabelsep=.707\pslabelsep\fi\fi
- \setbox\pst@hbox=\vbox to\z@{%
- \ifnum#2=1 \vskip\pslabelsep\else\vss\fi
- \hbox to\z@{%
- \ifnum#1=2 \hskip\pslabelsep\else\hss\fi
- \box\pst@hbox
- \ifnum#1=1 \hskip\pslabelsep\else\hss\fi}%
- \ifnum#2=2 \vskip\pslabelsep\else\vss\fi}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tx@Uput}
-% I forget how this works, but it does.
-% \begin{macrocode}
-\pst@def{Uput}<%
- /a ED
- add 2 div /h ED
- 2 div /w ED
- /s a sin def
- /c a cos def
- /b
- s abs c abs 2 copy gt
- dup /q ED
- { pop } { exch pop } ifelse
- def
- /w1 c b div w mul def
- /h1 s b div h mul def
- q
- { w1 abs w sub dup c mul abs }
- { h1 abs h sub dup s mul abs }
- ifelse>
-\pst@def{UUput}<%
- /z ED
- abs /y ED
- /x ED
- q
- { x s div c mul abs y gt }
- { x c div s mul abs y gt }
- ifelse
- { x x mul y y mul sub z z mul add sqrt z add }
- { q { x s div } { x c div } ifelse abs }
- ifelse
- a \tx@PtoC h1 add exch w1 add exch>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@getlabelsep,\Rput}
-% "\Rput" is an obsolete version of "\uput".
-% \begin{macrocode}
-\def\pst@getlabelsep#1{%
- \@ifnextchar[%
- {\def\refpoint@x{.5}\def\refpoint@y{.5}\pst@@getref{#1}}%
- {\pst@@getlabelsep{#1}}}
-\def\pst@@getlabelsep#1#2{\pssetlength\pslabelsep{#2}\pst@getref{#1}}
-\def\Rput{%
- \begin@psput{\pst@getlabelsep{\pst@getrputrot{\end@psput{\Rput@i\rput@i}}}}}
-\def\Rput@i{%
- \pst@dimg=\dp\pst@hbox
- \advance\pst@dimg\pslabelsep
- \dp\pst@hbox=\pst@dimg
- \pst@dimg=\ht\pst@hbox
- \advance\pst@dimg\pslabelsep
- \ht\pst@hbox=\pst@dimg
- \setbox\pst@hbox\hbox{\kern\pslabelsep\box\pst@hbox\kern\pslabelsep}}%
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Pictures\label{Pictures}}
-%
-% \begin{macro}{\pspicture}
-% \begin{macrocode}
-\def\pspicture{\begingroup\pst@ifstar\pst@picture}
-\def\pst@picture{%
- \@ifnextchar[{\pst@@picture}{\pst@@picture[0]}}
-\def\pst@@picture[#1]#2(#3,#4){%
- \@ifnextchar({\pst@@@picture[#1](#3,#4)}%
- {\pst@@@picture[#1](0,0)(#3,#4)}}
-\def\pst@@@picture[#1](#2,#3)(#4,#5){%
- \pssetxlength\pst@dima{#2}\pssetylength\pst@dimb{#3}%
- \pssetxlength\pst@dimc{#4}\pssetylength\pst@dimd{#5}%
- \def\pst@tempa{#1}%
- \setbox\pst@hbox=\hbox\bgroup
- \begingroup\KillGlue
- \@ifundefined{@latexerr}{}{\let\unitlength\psunit}%
- \edef\pic@coor{(#2,#3)(#2,#3)(#4,#5)}\ignorespaces}
-\def\pic@coor{(0,0)(0,0)(10,10)}
-\def\endpspicture{%
- \pst@killglue
- \endgroup
- \egroup
- \ifdim\wd\pst@hbox=\z@\else
- \@pstrickserr{Extraneous space in the pspicture environment}%
- {Type \space <return> \space to procede.}%
- \fi
- \ht\pst@hbox=\pst@dimd
- \dp\pst@hbox=-\pst@dimb
- \setbox\pst@hbox=\hbox{%
- \kern-\pst@dima
- \ifx\pst@tempa\@empty\else
- \advance\pst@dimd-\pst@dimb
- \pst@dimd=\pst@tempa\pst@dimd
- \advance\pst@dimd\pst@dimb
- \lower\pst@dimd
- \fi
- \box\pst@hbox
- \kern\pst@dimc}%
- \if@star\setbox\pst@hbox=\hbox{\clipbox@@\z@}\fi
- \leavevmode\box\pst@hbox
- \endgroup}
-\@namedef{pspicture*}{\pspicture*}
-\@namedef{endpspicture*}{\endpspicture}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Overlays\label{Overlays}}
-%
-% Overlays work by translating invisible material. They take advantage of the
-% fact that PostScript is running parallel to \TeX, and so we can redefine the
-% value of some PostScript variables in order to get a different overlay
-% printed each time we output a box containing overlay commands (even though
-% the box has already been typeset by \TeX).
-%
-% \begin{macro}{BeginOverlay}
-% "BeginOL" is a PostScript procedure, with syntax:
-% \begin{LVerbatim}
-% (<string>) BeginOL
-% \end{LVerbatim}
-% If the string is not "(all)" and does not match "TheOL", then the output is
-% made invisible by translating it over by the coffee pot (actually, by a
-% distance "OLUnit"). Otherwise, it is made visible by translating it back to
-% the page.
-%
-% Rather than translating the page, we could define a small clipping path off
-% the page, but that would be more likely to be messed up by someone's
-% "initclip" (e.g., by PSTricks' "initclip"!).
-% \begin{macrocode}
-\pst@def{BeginOL}<%
- dup (all) eq exch TheOL eq or
- { IfVisible not
- { CP OLUnit T moveto
- /IfVisible true def }
- if }
- { IfVisible
- { CP OLUnit \tx@NET moveto
- /IfVisible false def }
- if }
- ifelse>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{InitOL}
-% This figures out how far in the current units used by the driver is 50
-% inches up and to the right. This works even though drivers use unusual
-% coordinate systems (even "dvips"). This macro also defines "BOL" to be
-% "BeginOL" and sets the default value of "IfVisible".
-% \begin{macrocode}
-\pst@dimg=40in
-\edef\pst@OLunit{\pst@number\pst@dimg}
-\pst@def{InitOL}<%
- /OLUnit [ gsave CM \tx@STV \pst@OLunit
- dup moveto setmatrix CP grestore ] cvx def
- /BOL { \tx@BeginOL } def /IfVisible true def>
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@initoverlay}
-% This defines "TheOL" to be "#1". It must be inserted just before printing
-% overlay "#1".
-% \begin{macrocode}
-\def\pst@initoverlay#1{\pst@Verb{\tx@InitOL /TheOL (#1) def}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pst@overlay,\pst@endoverlay}
-% "\pst@overlay" just calls "BeginOverlay".
-% \begin{macrocode}
-\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}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\overlaybox,\endoverlaybox,\putoverlaybox}
-% "\pst@initoverlay", "\pst@overlay", and "\pst@endoverlay" are the overlays
-% primitives. An interface must be set up that guarantees that "\pst@overlay"
-% and "\pst@endoverlay" are only used inside a box, and that
-% "\pst@initoverlay" is inserted each type the box is printed. Here is one
-% such interface (see "seminar.sty" for an interface for slides). The extra
-% "\begingroup" and "\endgroup" assure that each "\pst@endoverlay" is executed
-% within the box.
-% \begin{macrocode}
-\newbox\theoverlaybox
-\def\overlaybox{%
- \setbox\theoverlaybox=\hbox\bgroup
- \begingroup
- \let\psoverlay\pst@overlay
- \def\overlaybox{%
- \@pstrickserr{Overlays cannot be nested}\@eha}%
- \def\putoverlaybox{%
- \@pstrickserr{You must end the overlay box
- before using \string\putoverlaybox}}%
- \psoverlay{main}}
-\def\endoverlaybox{\endgroup\egroup}
-\def\putoverlaybox#1{%
- \hbox{\pst@initoverlay{#1}\copy\theoverlaybox}}
-\def\psoverlay{\@pstrickserr{\string\psoverlay\space
- can only be used after \string\overlaybox}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \section{Configuration file -- revisited\label{Config:revisited}}
-%
-% \begin{macrocode}
-\ifx\pstcustomize\relax \input pstricks.con \fi
-% \end{macrocode}
-%
-% \begin{macrocode}
-\pst@ATH<end>
-\catcode`\@=\PstAtCode\relax
-\endinput
-% \end{macrocode}
-%
-% \endinput
-%
-%% END: pstricks.doc