%
% see pstricks.tex for license and copyright
%
% -----------  hv 20120219 -------------------
\newpsstyle{gridstyle}{subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=8pt}
\newpsstyle{gridstyleA}{subgriddiv=5,gridcolor=red!30,subgridcolor=green!20!black!10,gridlabels=0pt}
\newif\ifshowgrid
\newdimen\sh@wgridXunit
\newdimen\sh@wgridYunit

\def\pst@@showgrid#1#2#3\@nil{%                            hv 20130403
 \def\showgridp@s{0}%
 \ifx#1b\showgridtrue\else%                               bottom
   \ifx#1f\showgridfalse\else
     \ifx#1t
       \ifx#2r \showgridtrue\else%                        true->bottom
               \showgridtrue\def\showgridp@s{1}\fi%        top
 \fi\fi\fi
 \ifnum\showgridp@s>0\relax
   \sh@wgridXunit=\psxunit
   \sh@wgridYunit=\psyunit
 \fi
}

\define@key[psset]{pstricks}{showgrid}[b]{\expandafter\pst@@showgrid#1!!\@nil}
\define@boolkey[psset]{pstricks}[Pst@]{showframe}[true]{}
\define@boolkey[psset]{pstricks}[Pst@]{calcframe}[true]{}
\psset[pstricks]{showgrid=f,showframe=false,calcframe=false}

\define@boolkey[psset]{pstricks}[Pst@]{pgffunctions}[true]{}
\psset[pstricks]{pgffunctions=false}
%
\newdimen\pst@shift
\newif\ifPst@shift@star
\define@key[psset]{pstricks}{shift}[0]{%
 \ifx#1*
   \global\Pst@shift@startrue
   \pst@shift=\p@
 \else
   \global\Pst@shift@starfalse
   \pssetlength\pst@dimg{#1}
   \global\pst@shift\pst@dimg%   only the outer pspicture env can have a shift
 \fi}
\psset[pstricks]{shift=0}
%
% The main pspciture environment
%------------------------------- pspicture ------------------------------
%
\def\ps@readmargin#1,#2,#3,#4,#5\@nil{%
 \ifx\\#2\\
%    \typeout{>>> Case 1 para}%
   \pst@getlength{#1}\ps@margin@left
   \let\ps@margin@right\ps@margin@left
   \let\ps@margin@top\ps@margin@left
   \let\ps@margin@bottom\ps@margin@left
 \else
   \ifx\\#3\\%
%        \typeout{>>> Case 2 para: #1,#2}%
       \pst@getlength{#1}\ps@margin@left
       \def\ps@margin@right{0}%
       \pst@getlength{#2}\ps@margin@bottom
       \def\ps@margin@top{0}
   \else
%        \typeout{>>> Case 4 para: #1,#2,#3,#4}%
       \pst@getlength{#1}\ps@margin@left
       \pst@getlength{#2}\ps@margin@bottom
       \pst@getlength{#3}\ps@margin@right
       \pst@getlength{#4}\ps@margin@top
   \fi\fi
%\typeout{>>>>>>>>>\ps@margin@left,\ps@margin@bottom,\ps@margin@right,\ps@margin@top}%
}%
\define@key[psset]{pstricks}{margin}[0pt]{\ps@readmargin#1,,,,\@nil}
\psset[pstricks]{margin=0pt}
%

\ExplSyntaxOn
\define@key[psset]{pstricks}{alt}[]{\tl_set:Ne\l__tag_graphic_alt_tl{\text_purify:n{#1}}}
%\define@boolkey[psset]{pstricks}[]{artifact}[true]{}
\define@key[psset]{pstricks}{artifact}{%
   \bool_set_true:N \l__tag_graphic_artifact_bool
   \bool_set_false:N \l__tag_graphic_BBox_bool
}
\define@key[psset]{pstricks}{actualtext}[]{%
   \tl_set:Ne\l__tag_graphic_actual_tl{\text_purify:n{#1}}
   \bool_set_false:N \l__tag_graphic_BBox_bool
}
\define@key[psset]{pstricks}{correct-BBox}{%
   \bool_set_true:N \l__tag_graphic_bboxcorr_bool
   \seq_set_split:Nnn\l__tag_graphic_bboxcorr_seq{~}{#1~0pt~0pt~0pt~0pt}%
}
\define@key[psset]{pstricks}{tag}[]{%
   \str_case:nnF {#1}{
     {artifact}
           {
              \bool_set_true:N \l__tag_graphic_artifact_bool
              \bool_set_false:N \l__tag_graphic_BBox_bool
           }
           {false}{\tag_stop:}
         }
         {\tl_set:Nn\l__tag_graphic_struct_tl{#1}}
     }

\ExplSyntaxOff

\newcount\ps@imagectr
\ps@imagectr=0
%\newif\ifPst@findcoor
%\Pst@findcoorfalse
%

\def\pspicture{\begingroup\pst@ifstar\pst@picture}
\def\pst@picture{\@ifnextchar[{\pst@@picture}{\pst@@picture[]}}
\def\pst@@picture[#1]{%
 % showgrid=false%      for nested pspicture environemnets
 \def\pst@tempA{showgrid=false,#1}%     added 20250612  hv
 \psset{#1}% sets the shift and grid option
 \@ifnextchar({\pst@@picture@i[#1]}{\pst@@picture@@i[#1]}}%
\def\pst@@picture@@i[#1]{%
 \def\pic@coor{(0,0)(0,0)}%
 \gdef\pscoor{(10,10)}%
 \ifPst@calcframe
   \typeout{>>>Check for file \jobname-\the\numexpr\ps@imagectr+1.psaux}%
   \IfFileExists{\jobname-\the\numexpr\ps@imagectr+1.psaux}
     {\input{\jobname-\the\numexpr\ps@imagectr+1.psaux}%
      \xdef\pic@coor{(0,0)\pscoor}%
      \typeout{----->>\pic@coor}%
      \typeout{----->>\pscoor}%
     }
     {%\gdef\pscoor{(10,10)}
      %\def\pic@coor{(0,0)(0,0)(10,10)}
      }%
   %  \typeout{>>>\pscoor}%
 \fi
 \edef\@temp{[\noexpand#1]\pscoor}%
 \expandafter\pst@@picture@i\@temp}
%
\def\pst@@picture@i[#1]#2(#3,#4){\@ifnextchar(%   ignore anything between [] and ()
 {\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}%
 \pstVerb{/xCanvasLeft \pst@number\pst@dima def
          /yCanvasLeft \pst@number\pst@dimb def
          /xCanvasRight \pst@number\pst@dimc def
          /yCanvasRight \pst@number\pst@dimd def
 }%
 \ifdim\pst@dima>\pst@dimc
   \pst@dimg=\pst@dima
   \pst@dima=\pst@dimc
   \pst@dimc=\pst@dimg
 \fi
 \ifdim\pst@dimb>\pst@dimd
   \pst@dimg=\pst@dimb
   \pst@dimb=\pst@dimd
   \pst@dimd=\pst@dimg
 \fi
 \setbox\pst@hbox=\hbox\bgroup
 \begingroup\KillGlue
 \@ifundefined{@latexerr}{}{\let\unitlength\psunit}%
 \edef\pic@coor{(#2,#3)(#2,#3)(#4,#5)}%
% ----------- 1.10/12 beg hv -------------------
%  \psset{showgrid=false}%                % for nested pspicture environemnets
%  \def\pst@tempA{#1}%
%  \ifx\pst@tempA\@empty\else\psset{#1}\fi% sets the shift and grid option
 \ifx\pst@bgcolor\@empty\else\psframe*[linecolor=\pst@bgcolor](#2,#3)(#4,#5)\fi
 \ifshowgrid\ifnum\showgridp@s=0\psgrid[style=gridstyle]\fi\fi
% ----------- 1.10/12 end hv -------------------
 \ignorespaces%                        % 2008-12-07
 \ifPst@calcframe\pstVerb{ .trackbbox }\global\advance\ps@imagectr by 1 \fi
 \ifPst@pgffunctions\pstVerb{ pgffunctions }\fi% hv 2013-04-17
}

%\def\pic@coor{(0,0)(0,0)(10,10)}
\def\endpspicture{%
 \ifPst@calcframe
   \ifPSTlualatex
    \pstVerb{
    .trackedbbox        % xmin ymin xmax ymax
    % Die Koordinaten sind relativ zur Seite, also verschieben wir sie
    % zum aktuellen Punkt.
    currentpoint matrix translate dup invertmatrix dup 4 1 roll
    transform
    /YMAX exch def /XMAX exch def
    transform
    /YMIN exch def /XMIN exch def
    % Now we have all absolute coordinates
    \ifPst@showframe
      % Um jetzt an diesen Koordinaten zu zeichnen, ist das natürlich
      % ungünstig und wir müssen zurück schieben... (Oder den Code
      % umordnen, aber warum einfach wenns auch kompliziert geht ;P)
      XMIN YMIN XMAX XMIN sub YMAX YMIN sub    % lower left, width, height
      4 copy
      gsave
      currentpoint translate newpath rectstroke
      newpath 0 0 moveto                                            % x0 y0 x1 y1
      \ps@margin@top\space add \ps@margin@bottom\space add 4 1 roll % y1 x0 y0 x1
      \ps@margin@right\space add \ps@margin@left\space add 4 1 roll % x1 y1 x0 y0
      \ps@margin@bottom\space sub 4 1 roll                          % y0 x1 y1 x0
      \ps@margin@left\space sub   4 1 roll                          % x0 y0 x1 y1
      [3 3] 0 setdash rectstroke
      grestore
    \fi
    (\jobname-\the\[email protected]) (w) file /CoorFile exch def
    (\\gdef\\pscoor{\string\() CoorFile exch writestring
    XMIN %\pst@number\psxunit div
    \ps@margin@left\space sub 20 string cvs CoorFile exch writestring
    (pt, ) CoorFile exch writestring
    YMIN %\pst@number\psyunit div
    \ps@margin@bottom\space sub 20 string cvs CoorFile exch writestring
    (pt\string\)\string\() CoorFile exch writestring
    XMAX %\pst@number\psxunit div
    \ps@margin@right\space add 20 string cvs CoorFile exch writestring
    (pt, ) CoorFile exch writestring
    YMAX %\pst@number\psyunit div
    \ps@margin@top\space add 20 string cvs CoorFile exch writestring
    (pt\string\)}\% ) CoorFile exch writestring
    %(Unit is \pst@number\psyunit/\pst@number\psyunit) 40 string cvs CoorFile exch writestring
    CoorFile closefile
    }%
 \else
   \global\Pst@calcframefalse
   \PackageError{PSTricks}{You need to run lualatex for calculating the bounding box or set calcframe=false}{}%\@ehpa
 \fi
 \fi
 \ifshowgrid\ifnum\showgridp@s>0
   \psgrid[xunit=\sh@wgridXunit,yunit=\sh@wgridYunit,style=gridstyle]\fi\fi
 \pst@killglue
 \endgroup
 \egroup
 \ht\pst@hbox=\pst@dimd
 \dp\pst@hbox=-\pst@dimb
 \setbox\pst@hbox=\hbox{%
   \kern-\pst@dima
   \ifPst@shift@star%\typeout{==pstricks== old behaviour of the shift option}%     shift=*
     \advance\pst@dimd-\pst@dimb
     \pst@dimd=0.5\pst@dimd
   \else\pst@dimd-\pst@shift\fi
   \advance\pst@dimd\pst@dimb
   \lower\pst@dimd\box\pst@hbox
   \kern\pst@dimc}%
 \if@star\setbox\pst@hbox=\hbox{\psclipbox@@\z@}\fi
 \leavevmode
 \ifPst@draft
   \expandafter\ifx\csname @latexerr\endcsname\relax
     \box\pst@hbox
   \else%      do we have LaTeX?
     \fboxsep=0pt
     \fbox{\rule[-\pst@shift]{0pt}{\ht\pst@hbox}\rule{\wd\pst@hbox}{0pt}}%
   \fi
 \else
   \box\pst@hbox
 \fi
 \endgroup
 \psset[pstricks]{shift=0}% reset value
}
%
\@namedef{pspicture*}{\pspicture*}
\@namedef{endpspicture*}{\endpspicture}
%
%