%
% see pstricks.tex for license and copyright
%
\newif\ifpsmathbox
\psmathboxtrue
\def\pst@mathflag{\z@}
\newtoks\everypsbox
\let\pst@thisbox\relax
%
\long\def\pst@makenotverbbox#1#2{%
 \edef\pst@mathflag{%
 \ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else\z@\fi\else\z@\fi}%
 \setbox\pst@hbox=\hbox{%
   \ifcase\pst@mathflag\or$\m@th\textstyle\or$\m@th\displaystyle\fi%
   {\pst@thisbox\the\everypsbox#2}%
   \ifnum\pst@mathflag>\z@$\fi%                                     $
 }%
 #1}
%
\def\pst@makeverbbox#1{%
 \def\pst@afterbox{#1}%
 \edef\pst@mathflag{\ifpsmathbox\ifmmode\ifinner1\else2\fi\else\z@\fi\else\z@\fi}%
 \afterassignment\pst@beginbox%
 \setbox\pst@hbox\hbox%
}
\def\pst@beginbox{%
 \ifcase\pst@mathflag\or$\m@th\or$\m@th\displaystyle\fi%
 \bgroup\aftergroup\pst@endbox%
 \pst@thisbox%
 \the\everypsbox%
}
\def\pst@endbox{%
 \ifnum\pst@mathflag>\z@\relax$\fi%                      $
 \egroup%
 \pst@afterbox%
}
\def\pst@makebox{\pst@@makebox}
\def\psverbboxtrue{\def\pst@@makebox{\pst@makeverbbox}}
\def\psverbboxfalse{\def\pst@@makebox{\pst@makenotverbbox}}
\psverbboxfalse
\def\pst@longbox{%
 \def\pst@makebox{%
   \gdef\pst@makebox{\pst@@makebox}%
   \pst@makelongbox%
 }%
}
\def\pst@makelongbox#1{%
 \def\pst@afterbox{#1}%
 \edef\pst@mathflag{%
   \ifpsmathbox\ifmmode\ifinner 1\else 2\fi\else \z@\fi\else \z@\fi%
 }%
 \setbox\pst@hbox\hbox\bgroup
 \aftergroup\pst@afterbox
 \ifcase\pst@mathflag\or$\m@th\or$\m@th\displaystyle\fi
 \begingroup
 \pst@thisbox
 \the\everypsbox%
}
\def\pst@endlongbox{%
 \endgroup
 \ifnum\pst@mathflag>\z@$\fi           %$
 \egroup%
}
\def\pslongbox#1#2{%
 \@namedef{#1}{\pst@longbox#2}%
 \@namedef{end#1}{\pst@endlongbox}}
%
\newdimen\psframesep
\define@key[psset]{pstricks}{framesep}[3pt]{\pssetlength\psframesep{#1}}
\psset[pstricks]{framesep=3pt}
%
\define@boolkey[psset]{pstricks}[ps]{boxsep}[true]{}
\psset[pstricks]{boxsep}
%
\def\pst@useboxpar{%
 \use@par
 \if@star
   \let\pslinecolor\psfillcolor
   \solid@star
   \let\solid@star\relax
 \fi
 \ifpsdoubleline \pst@setdoublesep \fi}
%
\def\psframebox{\def\pst@par{}\pst@object{psframebox}}
\def\psframebox@i{\pst@makebox\psframebox@ii}
\def\psframebox@ii{%
 \begingroup
 \pst@useboxpar
 \pst@dima=\pslinewidth
 \advance\pst@dima by \psframesep
 \pst@dimc=\wd\pst@hbox\advance\pst@dimc by \pst@dima
 \pst@dimb=\dp\pst@hbox\advance\pst@dimb by \pst@dima
 \pst@dimd=\ht\pst@hbox\advance\pst@dimd by \pst@dima
 \setbox\pst@hbox=\hbox{%
   \ifpsboxsep\kern\pst@dima\fi
   \begin@ClosedObj
   \addto@pscode{%
     \psk@cornersize % arcradius boolean
     \pst@number\pst@dima neg
     \pst@number\pst@dimb neg
     \pst@number\pst@dimc
     \pst@number\pst@dimd
     .5
     \tx@Frame%
   }%
   \def\pst@linetype{2}%
   \showpointsfalse
   \end@ClosedObj
   \box\pst@hbox
   \ifpsboxsep\kern\pst@dima\fi%
 }%
 \ifpsboxsep\dp\pst@hbox=\pst@dimb\ht\pst@hbox=\pst@dimd\fi
 \leavevmode\box\pst@hbox
 \endgroup}
%
\def\psdblframebox{\def\pst@par{}\pst@object{psdblframebox}}
\def\psdblframebox@i{\addto@par{doubleline=true}\psframebox@i}
%
\define@key[psset]{pstricks}{clipcommand}[clip]{\def\pst@clipcommand{#1 }}
\psset[pstricks]{clipcommand=clip}% alternative is eoclip
%
\def\psclip{\@ifnextchar[\psclip@i{\psclip@i[]}}%
\def\psclip@i[#1]#2{%
 \leavevmode%
 \begingroup%
   \ifx\relax#1\relax\else\psset{#1}\fi%
   \begin@psclip%
     \begingroup%
       \def\use@pscode{%
         \pstVerb{
           \pst@dict
           /mtrxc CM def
           CP CP T
           \tx@STV
           \psk@origin
           \psk@swapaxes
           newpath
           \pst@code
           \pst@clipcommand
           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@{#2}%
 \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}}}

\ifPSTlualatex
 \AltClipMode
\fi

\def\psclipbox{\@ifnextchar[{\psclipbox@}{\psclipbox@[\z@]}}
% DG modification begin - Apr. 3, 1997
% From [email protected] (Dietrich Paulus)
%\def\clipbox@[#1]{\pst@makebox\clipbox@@{#1}}
\def\psclipbox@[#1]{\pst@makebox{\psclipbox@@{#1}}}
% DG modification end
\def\psclipbox@@#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
   \pst@clipcommand
   newpath
   0 0 moveto
   setmatrix}%
 \unhbox\pst@hbox%
 \end@psclip}}
%
\def\psshadowbox{\def\pst@par{}\pst@object{psshadowbox}}
\def\psshadowbox@i{\pst@makebox\psshadowbox@ii}
\def\psshadowbox@ii{%
\begingroup
\pst@useboxpar
\psshadowtrue
\psboxseptrue
\def\psk@shadowangle{-45 }%
\setbox\pst@hbox=\hbox{\psframebox@ii}%
\pst@dimh=\psk@shadowsize\p@
\pst@dimh=.7071\pst@dimh
\pst@dimg=\dp\pst@hbox
\advance\pst@dimg\pst@dimh
\dp\pst@hbox=\pst@dimg
\pst@dimg=\wd\pst@hbox
\advance\pst@dimg\pst@dimh
\wd\pst@hbox=\pst@dimg
\leavevmode
\box\pst@hbox
\endgroup}
%
\def\pscirclebox{\pst@object{pscirclebox}}
\def\pscirclebox@i{\pst@makebox\pscirclebox@ii}
\def\pscirclebox@ii{%
 \begingroup
 \pst@useboxpar
 \setbox\pst@hbox=\hbox{%
   \pst@nodehook
   \pscirclebox@iii
   \box\pst@hbox}%
 \ifpsboxsep\pscirclebox@sep\fi
 \leavevmode
 \box\pst@hbox
 \endgroup
 \ignorespaces
}
\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\space CLW 2 div add 0 360 arc closepath}%
   \end@ClosedObj
\fi
}
%
\def\pscirclebox@iv{
 \pst@number{\wd\pst@hbox} 2 div
 \pst@number{\ht\pst@hbox} \pst@number{\dp\pst@hbox} add 2 div
 2 copy \pst@number{\dp\pst@hbox} sub 4 2 roll
 \tx@Pyth \pst@number\psframesep add }
%
\def\pscirclebox@sep{%
 \pst@dimn=\ht\pst@hbox%                       % the height of the box
 \advance\pst@dimn by \dp\pst@hbox%            % the depth  of the box added to \pst@dimn
 \divide\pst@dimn by 2%                        % \pst@dimn/2
 \pst@dimm=0.5\wd\pst@hbox%                    % the half of the width
 \pst@Pyth\pst@dimm\pst@dimn\pst@dimo%         % the diameter
 \advance\pst@dimo by \pslinewidth%
 \advance\pst@dimo by \psframesep%
 \advance\pst@dimn by -\pst@dimo%
 \setbox\pst@hbox=\hbox to 2\pst@dimo{\hss\vbox{\kern-\pst@dimn\box\pst@hbox}\hss}%
 \advance\pst@dimn by -\dp\pst@hbox%
 \dp\pst@hbox=-\pst@dimn}
%
\let\pst@nodehook\relax
%
\def\psCirclebox{\def\pst@par{}\pst@object{psCirclebox}}
\def\psCirclebox@i{\pst@makebox\psCirclebox@ii}
\def\psCirclebox@ii{%
 \begingroup
 \pst@useboxpar
 \pst@dima=\ht\pst@hbox
 \advance\pst@dima by -\dp\pst@hbox
 \divide\pst@dima\tw@
 \pssetlength\pst@dimb\psk@radius
 \setbox\pst@hbox=\hbox{%
   \pst@nodehook
   \pscircle(.5\wd\pst@hbox,\pst@dima){\pst@dimb}%
   \box\pst@hbox}%
 \ifpsboxsep \psCirclebox@sep \fi
 \leavevmode
 \box\pst@hbox
 \endgroup
}
%
\def\psCirclebox@sep{%
 \pst@dimc=\pst@dimb
 \advance\pst@dimb-\pst@dima
 \advance\pst@dima\pst@dimc
 \setbox\pst@hbox=\hbox to\tw@\pst@dimc{%
   \hss\vrule width \z@ depth \pst@dimb height \pst@dima
   \box\pst@hbox\hss}}
%
\def\psovalbox{\def\pst@par{}\pst@object{psovalbox}}
\def\psovalbox@i{\pst@makebox{\psovalbox@ii}}
\def\psovalbox@ii{%
 \begingroup
 \pst@useboxpar
 \psovalbox@iii
 \ifpsboxsep\psovalbox@sep\fi
 \leavevmode
 \box\pst@hbox
 \endgroup}
%
\def\psovalbox@iii{%
 \psovalbox@iv
 \setbox\pst@hbox=\hbox{%
   \begin@ClosedObj
   \addto@pscode{%
     0 360
     \pst@number\pst@dimc CLW 2 div sub
     \pst@number\pst@dimd CLW 2 div sub
     \pst@number\pst@dima
     \pst@number\pst@dimb
     \tx@Ellipse
     closepath }%
   \def\pst@linetype{2}%
   \end@ClosedObj
   \unhbox\pst@hbox}}
%
\def\psovalbox@iv{%
 \pst@dimc=\pslinewidth\advance\pst@dimc\psframesep
 \pst@dimd=\ht\pst@hbox\advance\pst@dimd\dp\pst@hbox
 \pst@dima=.5\wd\pst@hbox
 \pst@dimb=.5\pst@dimd\advance\pst@dimb-\dp\pst@hbox
 \pst@dimd=.707\pst@dimd
 \advance\pst@dimd\pst@dimc
 \advance\[email protected]\wd\pst@hbox}
%
\def\psovalbox@sep{%
 \setbox\pst@hbox\hbox to 2\pst@dimc{\hss\unhbox\pst@hbox\hss}%
 \pst@dimg=\pst@dimd
 \advance\pst@dimg-\pst@dimb
 \dp\pst@hbox=\pst@dimg
 \advance\pst@dimd\pst@dimb
 \ht\pst@hbox=\pst@dimd}
%
\def\psdiabox{\def\pst@par{}\pst@object{psdiabox}}
\def\psdiabox@i{\pst@makebox{\psdiabox@ii}}
\def\psdiabox@ii{%
\begingroup
\pst@useboxpar
\psdiabox@iii
\ifpsboxsep\psdiabox@sep\fi
\leavevmode
\box\pst@hbox
\endgroup}
\def\psdiabox@iv{%
\pst@dimg=.707\pslinewidth
\advance\[email protected]\psframesep
\pst@dima=\wd\pst@hbox
\divide\pst@dima 2
\pst@dimc=\pst@dima
\advance\pst@dimc\pst@dimg
\pst@dimd=\ht\pst@hbox
\advance\pst@dimd\dp\pst@hbox
\divide\pst@dimd 2
\pst@dimb=\pst@dimd
\advance\pst@dimb-\dp\pst@hbox
\advance\pst@dimd\pst@dimg}
\def\psdiabox@iii{%
\psdiabox@iv
\setbox\pst@hbox=\hbox{%
\begin@ClosedObj
\addto@pscode{%
\psline@iii
pop
5
\pst@number\pst@dimc 2 mul \pst@number\pst@dimd 2 mul
0
\pst@number\pst@dima \pst@number\pst@dimb
\tx@Diamond}%
\def\pst@linetype{4}%
\end@ClosedObj
\box\pst@hbox}}
\def\psdiabox@sep{%
\setbox\pst@hbox\hbox to 4\pst@dimc{\hss\unhbox\pst@hbox\hss}%
\multiply\pst@dimd 2
\advance\pst@dimd\pst@dimb
\ht\pst@hbox\pst@dimd
\advance\pst@dimd-2\pst@dimb
\dp\pst@hbox\pst@dimd}
%
\define@key[psset]{pstricks}{trimode}[U]{\pst@expandafter\psset@@trimode{#1}\@empty\@empty\@nil}
\def\psset@@trimode#1#2#3\@nil{%
 \let\pst@tempg#1\relax
 \ifx\pst@tempg*
   \let\psk@@trimode\@empty
   \let\pst@tempg#2\relax
 \else
   \let\psk@@trimode\relax
 \fi
 \edef\psk@trimode{%
   \ifx R\pst@tempg 1 % Right
   \else
     \ifx D\pst@tempg 2 % Down
     \else
       \ifx L\pst@tempg 3 % Left
       \else
         \ifx l\pst@tempg 4 % |_
         \else
           \ifx r\pst@tempg 5 % _|
           \else 0 \fi     % Up
         \fi
       \fi
     \fi
   \fi}%
}
\psset[pstricks]{trimode=U}
%
\def\pstribox{\pst@object{pstribox}}
\def\pstribox@i{\pst@makebox{\pstribox@ii}}
\def\pstribox@ii{%
 \begingroup
 \pst@useboxpar
 \pstribox@iii
 \ifpsboxsep\pstribox@sep\fi
 \leavevmode
 \box\pst@hbox
 \endgroup}
%
\def\pstribox@iii{%
 \pstribox@iv
 \setbox\pst@hbox=\hbox{%
   \begin@ClosedObj
   \addto@pscode{
     \psline@iii
     pop
     0.5
     \pst@number\pst@dimc % Width
     \pst@number\pst@dimd % Height
     \ifcase\psk@trimode
            \or  %% 0
       exch \or  %% 1
            \or  %% 2
       exch \or  %% 3
            \or  %% 4
            \or  %% 5
     \fi
     \psk@trimode -90 mul
     \pst@number\pst@dima % x coor for text
     \pst@number\pst@dimb % y coor for text
     \tx@Triangle}%
   \def\pst@linetype{2}%
   \end@ClosedObj
   \box\pst@hbox}%
}
%
\def\pstribox@iv{%
 \pst@dimh=\pslinewidth
 \advance\pst@dimh\psframesep
 \pst@dimg=\ht\pst@hbox
 \advance\pst@dimg-\dp\pst@hbox         % totalheight
 \divide\pst@dimg 2                     % 0.5 totalheight
 \edef\pst@tempa{\number\pst@dimg sp}%  % For use by nodes.
 \ifodd\psk@trimode                     %
   \pst@dimb\pst@dimg
 \else
   \pst@dima=\wd\pst@hbox
   \divide\pst@dima 2
 \fi
 \ifcase\psk@trimode
   \pst@dimb=-\dp\pst@hbox
   \advance\pst@dimb-\pst@dimh
 \or\pst@dima=-\pst@dimh
 \or\pst@dimb=\ht\pst@hbox
    \advance\pst@dimb\pst@dimh
 \or\pst@dima=\wd\pst@hbox
    \advance\pst@dima\pst@dimh
 \fi
 \pst@dimd=\dp\pst@hbox
 \advance\pst@dimd\ht\pst@hbox
 \ifx\psk@@trimode\relax% no star for trimode=
   \pst@dimc=\wd\pst@hbox
   \advance\pst@dimc\ifodd\psk@trimode 1.447\else 1.789\fi\pst@dimh
   \multiply\pst@dimc 2
   \advance\pst@dimd\ifodd\psk@trimode 1.789\else 1.447\fi\pst@dimh
   \multiply\pst@dimd 2
 \else% trimode=R*,L*,U*,D*
   \ifodd\psk@trimode
     \advance\pst@dimd 1.1547\wd\pst@hbox
     \advance\pst@dimd 3.4641\pst@dimh
     \pst@dimc=.866\pst@dimd
   \else
     \advance\pst@dimd .866\wd\pst@hbox %.866=(sqrt(3)/2)
     \advance\pst@dimd 3\pst@dimh
     \pst@dimc=1.1547\pst@dimd % 1.1547=(2/sqrt(3))
   \fi
 \fi}
%
\def\pstribox@sep{%
\ifodd\psk@trimode
\advance\[email protected]\pst@dimd
\ht\pst@hbox=\pst@dimb
\advance\pst@dimd-\pst@dimb
\dp\pst@hbox=\pst@dimd
\else
\setbox\pst@hbox\hbox to \pst@dimc{\hss\unhbox\pst@hbox\hss}%
\global\pst@dimg=.5\pst@dimc
\fi
\ifcase\psk@trimode
\dp\pst@hbox-\pst@dimb
\advance\pst@dimd\pst@dimb
\ht\pst@hbox\pst@dimd
\or
\pst@dimg=.5\wd\pst@hbox
\global\advance\pst@dimg-\pst@dima
\setbox\pst@hbox\hbox to \pst@dimc{\kern-\pst@dima\box\pst@hbox\hss}%
\or
\ht\pst@hbox\pst@dimb
\advance\pst@dimd-\pst@dimb
\dp\pst@hbox\pst@dimd
\or
\pst@dimg=\pst@dimc
\advance\pst@dimg-\pst@dima
\global\advance\[email protected]\wd\pst@hbox
\setbox\pst@hbox\hbox to \pst@dimc{%
\hss\box\pst@hbox\kern\psframesep\kern\pslinewidth}%
\fi}
%
\def\pst@starbox{%
\setbox\pst@hbox\hbox{\psframebox*[boxsep=false]{\unhbox\pst@hbox}}}
\def\pst@@makesmall#1{%
\setbox#1=\hbox to\z@{\hss\vbox to \z@{\vss\box#1\vss}\hss}}
\def\pst@@@makesmall#1{%
\pst@dimh=\psk@xref\wd#1%
\ifx\psk@yref\relax
\pst@dimg=\dp#1%
\else
\pst@dimg=\psk@yref\ht#1%
\advance\pst@dimg\psk@yref\dp#1%
\fi
\setbox#1=\hbox to\z@{%
\kern-\pst@dimh\vbox to\z@{\vss\box#1\kern-\pst@dimg}\hss}}
%
\def\psscalebox#1{\pst@makebox{\ps@scalebox{#1}}}
\def\ps@scalebox#1{%
 \begingroup%
 \pst@getscale{#1}\pst@tempa%
 \let\pst@tempc\pst@tempg%
 \let\pst@tempd\pst@temph%
 \ps@@scalebox%
 \endgroup}
\def\ps@@scalebox{%
 \leavevmode%
 \hbox{%
   \ifdim\pst@tempd\p@<\z@%
     \pst@dimg=\pst@tempd\ht\pst@hbox%
     \pst@dimh=\pst@tempd\dp\pst@hbox%
     \dp\pst@hbox=-\pst@dimg%
     \ht\pst@hbox=-\pst@dimh%
   \else%
     \ht\pst@hbox=\pst@tempd\ht\pst@hbox%
     \dp\pst@hbox=\pst@tempd\dp\pst@hbox%
   \fi%
   \pst@dima=\pst@tempc\wd\pst@hbox%
   \ifdim\pst@dima<\z@\kern-\pst@dima\fi%
   \pst@Verb{CP CP translate \pst@tempa \tx@NET}%
   \hbox to \z@{\box\pst@hbox\hss}%
   \pst@Verb{
     CP CP translate
     1 \pst@tempc div 1 \pst@tempd div scale
     \tx@NET}%
   \ifdim\pst@dima>\z@\kern\pst@dima\fi%
 }%
}
\pslongbox{Scalebox}{\psscalebox}
%
\def\psscaleboxto(#1,#2){\pst@makebox{\ps@scaleboxto(#1,#2)}}
\def\ps@scaleboxto(#1,#2){%
 \begingroup
 \pssetlength\pst@dima{#1}%
 \pssetlength\pst@dimb{#2}%
 \ifdim\pst@dima=\z@\else
   \pst@divide{\pst@dima}{\wd\pst@hbox}\pst@tempc
   \edef\pst@tempc{\pst@tempc\space}%
 \fi
 \ifdim\pst@dimb=\z@
   \ifdim\pst@dima=\z@
     \@pstrickserr{%
       \string\psscaleboxto\space dimensions cannot both be zero}\@ehpa
     \def\pst@tempa{}%
     \def\pst@tempc{1 }%
     \def\pst@tempd{1 }%
   \else
     \let\pst@tempd\pst@tempc
   \fi
 \else
   \pst@dimc=\ht\pst@hbox
   \advance\pst@dimc\dp\pst@hbox
   \pst@divide{\pst@dimb}{\pst@dimc}\pst@tempd
   \edef\pst@tempd{\pst@tempd\space}%
   \ifdim\pst@dima=\z@ \let\pst@tempc\pst@tempd \fi
 \fi
 \edef\pst@tempa{\pst@tempc \pst@tempd scale }%
 \ps@@scalebox
 \endgroup}
\pslongbox{Scaleboxto}{\psscaleboxto}