%
% 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 paulus@immd5.informatik.uni-erlangen.de (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\pst@dimc.707\wd\pst@hbox}
%
\def\psovalbox@sep{%
  \setbox\pst@hbox\hbox to 2\pst@dimc{\hss\unhbox\pst@hbox\hss}%
  \pst@dimg=\pst@dimd
  \advance\pst@dimg-\pst@dimb
  \dp\pst@hbox=\pst@dimg
  \advance\pst@dimd\pst@dimb
  \ht\pst@hbox=\pst@dimd}
%
\def\psdiabox{\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\pst@dimg.707\psframesep
\pst@dima=\wd\pst@hbox
\divide\pst@dima 2
\pst@dimc=\pst@dima
\advance\pst@dimc\pst@dimg
\pst@dimd=\ht\pst@hbox
\advance\pst@dimd\dp\pst@hbox
\divide\pst@dimd 2
\pst@dimb=\pst@dimd
\advance\pst@dimb-\dp\pst@hbox
\advance\pst@dimd\pst@dimg}
\def\psdiabox@iii{%
\psdiabox@iv
\setbox\pst@hbox=\hbox{%
\begin@ClosedObj
\addto@pscode{%
\psline@iii
pop
.5
\pst@number\pst@dimc 2 mul \pst@number\pst@dimd 2 mul
0
\pst@number\pst@dima \pst@number\pst@dimb
\tx@Diamond}%
\def\pst@linetype{4}%
\end@ClosedObj
\box\pst@hbox}}
\def\psdiabox@sep{%
\setbox\pst@hbox\hbox to 4\pst@dimc{\hss\unhbox\pst@hbox\hss}%
\multiply\pst@dimd 2
\advance\pst@dimd\pst@dimb
\ht\pst@hbox\pst@dimd
\advance\pst@dimd-2\pst@dimb
\dp\pst@hbox\pst@dimd}
%
\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\pst@dimb.5\pst@dimd
\ht\pst@hbox=\pst@dimb
\advance\pst@dimd-\pst@dimb
\dp\pst@hbox=\pst@dimd
\else
\setbox\pst@hbox\hbox to \pst@dimc{\hss\unhbox\pst@hbox\hss}%
\global\pst@dimg=.5\pst@dimc
\fi
\ifcase\psk@trimode
\dp\pst@hbox-\pst@dimb
\advance\pst@dimd\pst@dimb
\ht\pst@hbox\pst@dimd
\or
\pst@dimg=.5\wd\pst@hbox
\global\advance\pst@dimg-\pst@dima
\setbox\pst@hbox\hbox to \pst@dimc{\kern-\pst@dima\box\pst@hbox\hss}%
\or
\ht\pst@hbox\pst@dimb
\advance\pst@dimd-\pst@dimb
\dp\pst@hbox\pst@dimd
\or
\pst@dimg=\pst@dimc
\advance\pst@dimg-\pst@dima
\global\advance\pst@dimg.5\wd\pst@hbox
\setbox\pst@hbox\hbox to \pst@dimc{%
\hss\box\pst@hbox\kern\psframesep\kern\pslinewidth}%
\fi}
%
\def\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}
