% $Id: pst-plot.tex 1056 2019-05-17 07:39:59Z herbert $ %% %% BEGIN pst-plot.tex %% %% plotting functions and data with PSTricks. %% See the betadoc documentation for usage. %% %% COPYRIGHT 1993, 1994, 1999 by Timothy Van Zandt, tvz@nwu.edu. %% COPYRIGHT 2009-- by Herbert Voss, hvoss@tug.org. %% %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN %% archives in directory macros/latex/base/lppl.txt. %% % \csname PSTplotLoaded\endcsname \let\PSTplotLoaded\endinput % \ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi \ifx\PSTXKeyLoaded\endinput\else \input pst-xkey.tex\fi \ifx\PSTtoolsloaded\endinput\else\input pst-tools.tex\fi \ifx\PSTtoolsloaded\endinput\else\input pstricks-add.tex\fi \ifx\PSTFPloaded\endinput\else \input pst-fp.tex \fi \ifx\MultidoLoaded\endinput\else \input multido.tex \fi % \def\fileversion{1.92} \def\filedate{2019/05/16} \message{ v\fileversion, \filedate\space (tvz,hv)} % \edef\TheAtCode{\the\catcode`\@} \catcode`\@=11 % \pst@addfams{pst-plot} % \def\pst@linetype{2}% \SpecialCoor % \def\psPiFour{12.566371} \def\psPiTwo{6.283185} \def\psPi{3.14159265} \def\psPiH{1.570796327} \newdimen\pstRadUnit \newdimen\pstRadUnitInv \pstRadUnit=1.047198cm % this is pi/3 \pstRadUnitInv=0.95493cm % this is 3/pi % % Using lists of data is optimized for \dataplot and \fileplot % Here is the tricky part. As each line is read from file, % we want to ignore trailing delimiters, and convert arbitrary % strings of non-trailing delimiters to _D_. % We end up with % D x1 D y1 D x2 D y2 ... D xn D yn % \begingroup \catcode`\{=13 \catcode`\}=13 \catcode`\(=13 \catcode`\)=13 \catcode`\,=13 \catcode`\!=1 \catcode`\*=2 \catcode`\ =13 \catcode`\_=13 \catcode`\^^M=13 \gdef\pst@datadelimiters!% Begin def \catcode`\{=13% \catcode`\}=13% \catcode`\(=13% \catcode`\)=13% \catcode`\,=13% \catcode`\ =13% \catcode`\^^M=13% \def,##1!% \ifcat\noexpand,\noexpand##1% \expandafter##1% \else\space% D\space##1% \fi*% \let(,\let),\let{,\let},\let ,\let^^M,\let_\@empty*% End def \endgroup \define@key[psset]{pst-plot}{ignoreLines}[0]{\def\psk@ignoreLines{#1}} \psset[pst-plot]{ignoreLines=0} % \newcount\pst@linecnt \begingroup \catcode`\,=13 \catcode`\_=13 \gdef\savedata@#1[#2]{% \xdef\pst@tempg{#2_}% \endgroup \let#1\pst@tempg \global\let\pst@tempg\relax \ignorespaces} % \gdef\readdata@{% \read1 to \pst@tempA \ifnum\pst@linecnt=\psk@nStep \global\pst@linecnt=0 \expandafter\readdata@@\pst@tempA_\@nil \fi \global\advance\pst@linecnt by 1 \ifeof1\else\expandafter\readdata@\fi} \gdef\pst@@readfile#1#2\@nil{\addto@pscode{,#1#2}}% \gdef\readdata@@#1#2\@nil{\xdef\pst@tempg{\pst@tempg,#1#2}}% \endgroup % \def\readdata{\@ifnextchar[{\readdata@i}{\readdata@i[]}} \def\readdata@i[#1]#2#3{% % \def\pst@tempA{#1}% \openin1=#3 \begingroup \ifx#1\relax#1\else\psset{#1}\fi \def\pst@tempg{}% \ifeof1 \@pstrickserr{Data file `#3' not found.}\@ehpa \else \pst@datadelimiters \catcode`\[=1 \catcode`\]=2 \pst@cnta=0 \loop \ifnum\the\pst@cnta<\psk@ignoreLines \advance\pst@cnta by 1\relax \read1 to \pst@tempA \repeat \psDEBUG[pst-plot]{>>> ignored \the\pst@cnta\space data lines}% \global\pst@linecnt=\psk@nStep \readdata@ \fi \endgroup \global\let#2\pst@tempg% \global\let\pst@tempg\relax% \ignorespaces} % \def\pst@readfile#1{{\let\readdata@@\pst@@readfile\readdata\pst@tempg{#1}}} \def\pst@altreadfile#1{% \openin1=#1 \ifeof1 \@pstrickserr{Data file `#1' not found.}\@ehpa \else \catcode`\{=10 \catcode`\}=10 \catcode`\(=10 \catcode`\)=10 \catcode`\,=10 \catcode`\^^M=10 \catcode`\[=1 \catcode`\]=2 \pst@@altreadfile \fi} \def\pst@@altreadfile{% \read1 to \pst@tempg \expandafter\pst@@@altreadfile\pst@tempg\@empty\@nil \ifeof1\else\expandafter\pst@@@altreadfile\fi} \def\pst@@@altreadfile#1#2\@nil{\addto@pscode{#1#2}}% % \def\savedata#1{\begingroup\pst@datadelimiters\savedata@{#1}} % \newread\RCD@file \def\psreadDataColumn{\@ifnextchar[\psreadDataColumn@i{\psreadDataColumn@i[]}} \def\psreadDataColumn@i[#1]{% \psset{#1}% \psreadDataColumn@ii } \def\psreadDataColumn@ii#1#2#3#4{% #1:column #2:delimiter #3:\result #4:data file \immediate\openin\RCD@file=#4\relax \global\let#3=\@empty \pst@cnta=0 \loop \ifnum\the\pst@cnta<\psk@ignoreLines \advance\pst@cnta by 1\relax \read\RCD@file to \@tempa \repeat \loop \read\RCD@file to \@tempa \ifeof\RCD@file\else \edef\@tempa{\@tempa#2}% \def\reserved@b{}% \@tempswafalse \@tempcnta=#1\relax \expandafter\@tfor\expandafter\reserved@a \expandafter:\expandafter=\@tempa\do{% loop over every token \if\reserved@a#2\relax% delimiter? \advance\@tempcnta \m@ne \ifnum \@tempcnta=\z@ \expandafter\g@addto@macro\expandafter#3\expandafter{\reserved@b\space}% \@tempswatrue \fi \def\reserved@b{}% ??? \else \edef\reserved@b{\reserved@b\reserved@a} \fi \if@tempswa\@break@tfor\fi }% \repeat \immediate\closein\RCD@file } %%%%%%%%%%%%%% the plot-styles %%%%%%%%%%%%%%%%%% % \def\beginplot@line{\begin@OpenObj} \def\endplot@line{\psline@ii} % \def\beginplot@polygon{\begin@ClosedObj} \def\endplot@polygon{\pspolygon@ii} % \def\beginplot@curve{\begin@OpenObj} \def\endplot@curve{\pscurve@ii} % \def\beginplot@ecurve{\begin@OpenObj} \def\endplot@ecurve{\psecurve@ii} % \def\beginplot@ccurve{\begin@ClosedObj} \def\endplot@ccurve{\psccurve@ii} % \def\beginplot@dots{\begin@SpecialObj} \def\endplot@dots{\psdots@ii} % \define@key[psset]{pst-plot}{Hue}[180]{\pst@getint{#1}\pst@HueAngle} \psset[pst-plot]{Hue=180} \def\beginplot@colordots{\begin@SpecialObj} \def\endplot@colordots{% \addto@pscode{% \psk@dotsize \@nameuse{psds@\psk@dotstyle} newpath /MaxValue 0 def /m n 2 mul def n { dup MaxValue gt { dup /MaxValue ED } if m 2 roll } repeat n { dup MaxValue div % y y \pst@number\psyunit div abs % to orig y value \pst@HueAngle\space 360 div exch dup sethsbcolor % 180 Y Y hsb color transform floor .5 add exch floor .5 add exch itransform Dot stroke } repeat }% \end@SpecialObj% } % \def\beginplot@bubble{\begin@SpecialObj} \def\endplot@bubble{% \addto@pscode{% newpath n { dup % x y y \pst@number\psyunit div abs % to orig y value transform floor .5 add exch floor .5 add exch itransform 0 360 arc \psk@fill stroke } repeat }% \end@SpecialObj% } % \def\beginplot@bezier{\begin@OpenObj} \def\endplot@bezier{\psbezier@ii} % \def\beginplot@cbezier{\begin@ClosedObj} \def\endplot@cbezier{\pscbezier@ii} % \def\beginplot@cspline{\begin@OpenObj}%% Christoph Bersch \def\endplot@cspline{\pscspline@ii} % \let\beginplot@LineToYAxis\beginplot@line % all from pst-plot added 2007-06-26 (hv) \def\endplot@LineToYAxis{\psLineToYAxis@ii} \let\beginqp@LineToYAxis\beginqp@line \let\doqp@LineToYAxis\doqp@line \let\endqp@LineToYAxis\endqp@line \let\testqp@LineToYAxis\testqp@line \let\beginplot@LineToXAxis\beginplot@line \def\endplot@LineToXAxis{\psLineToXAxis@ii} \let\beginqp@LineToXAxis\beginqp@line \let\doqp@LineToXAxis\doqp@line \let\endqp@LineToXAxis\endqp@line \let\testqp@LineToXAxis\testqp@line % \newif\ifPst@interrupt \Pst@interruptfalse \define@key[psset]{pst-plot}{barwidth}[0.25cm]{\pst@getlength{#1}\Add@barwidth} \psset[pst-plot]{barwidth=0.25cm} \define@key[psset]{pst-plot}{interrupt}[]{\expandafter\pst@interrupt#1,,,\@nil} \def\pst@interrupt#1,#2,#3,#4\@nil{% \ifx\relax#1\relax \Pst@interruptfalse \else \Pst@interrupttrue \def\pst@interrupt@YMax{#1 }% \def\pst@interrupt@YMaxSep{#2 }% \def\pst@interrupt@YMaxDiff{#3 }% \fi } % \def\psbar@ii{\addto@pscode{false \tx@NArray \psbar@iii}} \def\psbar@iii{% \ifPst@interrupt /YMax \pst@interrupt@YMax \strip@pt\psyunit\space mul def /YMaxSep \pst@interrupt@YMaxSep \strip@pt\psyunit\space mul def /YMaxDiff \pst@interrupt@YMaxDiff \strip@pt\psyunit\space mul def /Tilde { % on stack DX /Op ED % add or sub /DX ED currentpoint 2 copy /Y ED /X ED % x y X DX add Y YMaxSep 2 div Op X DX dup add add Y curveto currentpoint 2 copy pop /X ED X DX add Y YMaxSep 2 div neg Op X DX dup add add Y curveto } def newpath n { /Yval exch def /Xval exch def Xval \number\Add@barwidth 0.5 mul sub 0 moveto Yval YMax le { 0 Yval rlineto \number\Add@barwidth 0 rlineto 0 Yval neg rlineto \number\Add@barwidth neg 0 rlineto }{ 0 YMax rlineto \number\Add@barwidth 4 div { add } Tilde 0 YMax neg rlineto \number\Add@barwidth neg 0 rlineto closepath Xval \number\Add@barwidth 0.5 mul sub YMax YMaxSep add moveto 0 Yval YMax sub YMaxSep sub YMaxDiff sub rlineto \number\Add@barwidth 0 rlineto 0 Yval YMax YMaxSep add sub YMaxDiff sub neg rlineto \number\Add@barwidth 4 div neg { sub } Tilde } ifelse } repeat \else newpath n { /Yval exch def /Xval exch def Xval \number\Add@barwidth 0.5 mul sub 0 moveto 0 Yval rlineto \number\Add@barwidth 0 rlineto 0 Yval neg rlineto \number\Add@barwidth neg 0 rlineto } repeat \fi }% \def\beginplot@bar{\begin@SpecialObj} \def\endplot@bar{% \psbar@ii\psk@fillstyle\ifpsshadow\pst@closedshadow\fi% \pst@stroke \end@SpecialObj} % \def\psybar@ii{\addto@pscode{false \tx@NArray \psybar@iii}} \def\psybar@iii{% newpath n { /Yval exch def /Xval exch def 0 Yval \number\Add@barwidth 0.5 mul sub moveto Xval 0 rlineto 0 \number\Add@barwidth rlineto Xval neg 0 rlineto 0 \number\Add@barwidth neg rlineto } repeat }% \def\beginplot@ybar{\begin@SpecialObj} \def\endplot@ybar{% \psybar@ii\psk@fillstyle\ifpsshadow\pst@closedshadow\fi% \pst@stroke \end@SpecialObj} % % LSM Least Square Method 2006-03-13 (hv) \def\psLSM@ii{\addto@pscode{ false \tx@NArray \psLSM@iii }} \def\psLSM@iii{% /xiSquare 0 def % xi*xi /xi 0 def % xi /fi 0 def % f(xi) /xifi 0 def % xi*f(xi) exch dup dup /xEnd ED /xStart ED exch n { % number of data pairs /Yval ED /Xval ED % save x y values /xi xi Xval add def % sum xi /xiSquare xiSquare Xval dup mul add def % sum xi*xi /xifi xifi Xval Yval mul add def % sum xi*yi, same as xi*f(xi) /fi fi Yval add def % sum yi, same as f(xi) Xval xStart lt { /xStart Xval def } if % find the lowest xi Xval xEnd gt { /xEnd Xval def } if % find the largest xi } repeat /u xiSquare fi mul xi xifi mul sub n xiSquare mul xi dup mul sub div def /v n xifi mul xi fi mul sub n xiSquare mul xi dup mul sub div def \Pst@Debug\space 0 gt { % print the equation /NimbusSanL-Regu findfont 12 scalefont setfont 0 -50 moveto (y=) show % print y= v \pst@number\psyunit \pst@number\psxunit div div 20 string cvs show ( x+) show % m*x+ u \pst@number\psyunit div 20 string cvs show } if newpath (\psk@xStart) length 0 gt % special start value? { \psk@xStart\space \pst@number\psxunit mul } { xStart } ifelse dup v mul u add % xStart f(xStart) moveto % goto first point x1 y(x1) (\psk@xEnd) length 0 gt % special end value? { \psk@xEnd\space \pst@number\psxunit mul } { xEnd } ifelse dup v mul u add % xEnd f(xEnd) lineto % line to second point x2 y(x2) }% % \def\beginplot@LSM{\begin@SpecialObj} \def\endplot@LSM{% \psLSM@ii\psk@fillstyle\ifpsshadow\pst@closedshadow\fi% \pst@stroke \end@SpecialObj} % \define@key[psset]{pst-plot}{IQLfactor}{\pst@checknum{#1}\pst@IQLfactor} \psset[pst-plot]{IQLfactor=1.5} \define@key[psset]{pst-plot}{postAction}[]{\def\psk@postAction{% \ifx\relax#1\relax\else\pst@number\psyunit div #1 \pst@number\psyunit mul \fi }} \psset[pst-plot]{postAction=} \define@key[psset]{pst-plot}{mediancolor}[black]{\pst@getcolor{#1}\median@linecolor} \psset[pst-plot]{mediancolor=black} \define@boolkey[psset]{pst-plot}[Pst@]{markMedian}[true]{} \psset[pst-plot]{markMedian=false} % \def\psBoxplot@ii{% \addto@pscode{ /Barwidth \number\Add@barwidth 2 div def /Endwidth Barwidth \psk@arrowlength\space mul def NArray bubblesort /NArray ED % save sorted array [ NArray { yUnit mul } forall ] /NArray ED % multiply with y unit NArray 0 get /MinVal ED % save minimum NArray m 1 sub get /MaxVal ED % maximum m 2 div cvi /M ED % the middle NArray length 2 mod 0 eq { % even numbers of entries M 1 sub NArray exch get % even number of values NArray M get % and the upper one add 2 div /Median ED % the median }{ NArray M get /Median ED % odd numbers of values } ifelse m 4 mod 0 eq { % get the lower Quartil even/odd m 4 div cvi dup 1 sub NArray exch get exch NArray exch get % M 2 div cvi 1 add dup /M2 ED % save middle index % 1 sub NArray exch get % NArray M2 get add 2 div floor /LowerQuartil ED }{ NArray M 2 div cvi get /LowerQuartil ED } ifelse % end even/odd m 0.75 mul dup dup cvi sub 0 eq { % get the upper Quartil % 0.75*m is an integer cvi dup 1 sub NArray exch get exch NArray exch get % M 1.5 mul cvi 1 add dup /M3 ED % 1 sub NArray exch get % NArray M3 get add 2 div floor /UpperQuartil ED }{ % upper quartil NArray m 0.75 mul floor cvi get /UpperQuartil ED } ifelse % /IQL UpperQuartil LowerQuartil sub \pst@IQLfactor\space mul def 0 1 m 1 sub { % Index on stack dup /Index ED NArray exch get LowerQuartil sub abs IQL sub 0 gt { \psk@dotsize \@nameuse{psds@\psk@dotstyle} 0 NArray Index get \psk@postAction Dot NArray Index LowerQuartil UpperQuartil LowerQuartil sub \pst@IQLfactor\space mul sub dup /MinVal ED put % replace with 1.5 IQL NArray Index 1 add get /MinVal ED } { exit } ifelse } for m 1 sub -1 0 { % Index on stack dup /Index ED NArray exch get UpperQuartil sub abs IQL sub 0 gt { % newpath \psk@dotsize \@nameuse{psds@\psk@dotstyle} 0 NArray Index get \psk@postAction\space Dot NArray Index UpperQuartil LowerQuartil sub \pst@IQLfactor\space mul UpperQuartil add dup /MaxVal ED put % replace with 1.5 IQL NArray Index 1 sub get /MaxVal ED }{ exit } ifelse } for % Endwidth neg MaxVal \psk@postAction moveto % we are on top / lower whisker Endwidth dup add 0 rlineto 0 MaxVal \psk@postAction moveto 0 UpperQuartil \psk@postAction lineto % upper quartil %% MinVal \psk@postAction MaxVal \psk@postAction lt { 0 LowerQuartil \psk@postAction moveto % line to lower whisker 0 MinVal \psk@postAction lineto Endwidth neg MinVal \psk@postAction moveto Endwidth dup add 0 rlineto } if gsave \pst@number\pslinewidth SLW \pst@usecolor\pslinecolor \tx@setStrokeTransparency % \tx@setStrokeTransparency \@nameuse{psls@\pslinestyle} stroke grestore newpath Barwidth neg LowerQuartil \psk@postAction moveto % lower quartil Barwidth neg UpperQuartil \psk@postAction lineto Barwidth dup add 0 rlineto Barwidth LowerQuartil \psk@postAction lineto closepath \pst@usecolor\psfillcolor gsave \pst@usecolor\psfillcolor \tx@setTransparency fill grestore \@nameuse{psls@solid} \ifPst@markMedian \pst@number\pslabelsep neg Median moveto currentpoint /YMedian ED /XMedian ED Barwidth neg Median \psk@postAction lineto % median \else Barwidth neg Median \psk@postAction moveto % median \fi Barwidth dup add 0 rlineto \pst@number\pslinewidth SLW \pst@usecolor\median@linecolor \tx@setStrokeTransparency % \tx@setStrokeTransparency % \@nameuse{psls@solid} stroke % \ifPst@markMedian XMedian XMedian moveto \fi } % \ifPst@markMedian % \rput{90}(! currentpoint \tx@ScreenCoor){2.5} % \fi }% % \def\beginplot@Boxplot{\init@pscode} \def\endplot@Boxplot{% \psBoxplot@ii\psk@fillstyle\ifpsshadow\pst@closedshadow\fi% \pst@stroke \end@SpecialObj} % \def\psBoxplot{\def\pst@par{}\pst@object{psBoxplot}} \def\psBoxplot@i#1{% \leavevmode \pst@killglue \begingroup \addbefore@par{barwidth=40pt,arrowlength=0.75}% \addto@par{plotstyle=Boxplot}% \use@par \@nameuse{beginplot@\psplotstyle}% \addto@pscode{ /D {} def [ #1 ] /NArray ED NArray aload length /m ED /xUnit \pst@number\psxunit def /yUnit \pst@number\psyunit def }% \@nameuse{endplot@\psplotstyle}% \ignorespaces% } % \define@key[psset]{pst-plot}{plotstyle}[line]{% \@ifundefined{beginplot@#1}% {\@pstrickserr{Plot style `#1' not defined}\@eha}% {\def\psplotstyle{#1}}} \psset[pst-plot]{plotstyle=line} % \define@key[psset]{pst-plot}{plotpoints}[50]{% \pst@cntg=#1\relax \ifnum\pst@cntg<2 \@pstrickserr{plotpoints parameter must be at least 2}\@ehpa \else \advance\pst@cntg-1 \edef\psk@plotpoints{\the\pst@cntg\space}% \fi} \psset[pst-plot]{plotpoints=50} % %the following works only for plotstyle line, polygon and bezier \define@key[psset]{pst-plot}{yMaxValue}[1.e30]{\def\psk@yMaxValue{#1 }\def\psk@yMinValue{#1 neg }} \psset{yMaxValue=1.e30} \define@key[psset]{pst-plot}{yMinValue}[-1.e30]{\def\psk@yMinValue{#1 }} \psset{yMinValue=-1.e30} % can be in PS syntax (eg 1e1.2) and must be positiv! negative values % will beignored % % For quick plots, define: % \beginqp@ : What to do to first point (PS code only). % \doqp@ : What to do to subsequent points (PS code only). % \endqp@ : How to end plot. % \testqp@ : Set \@psttrue if OK to use quick plot. % \def\beginqp@line{\pst@oplineto} \def\doqp@line{ dup \psk@yMaxValue \pst@number\psyunit mul gt { moveto } { dup \psk@yMinValue \pst@number\psyunit mul lt { moveto } { L } ifelse } ifelse } \def\endqp@line{% \ifPst@variableLW \addto@pscode{ \pst@flattenpath }\fi% \end@OpenObj}% \def\testqp@line{% \ifdim\pslinearc>\z@\else \ifshowpoints\else \ifx\psk@arrowA\@empty \ifx\psk@arrowB\@empty \@psttrue \fi \fi \fi \fi} % \def\beginqp@polygon{moveto } \def\doqp@polygon{ dup \psk@yMaxValue \pst@number\psyunit mul gt { moveto }{ dup \psk@yMinValue \pst@number\psyunit mul lt { moveto }{ L } ifelse } ifelse } \def\endqp@polygon{% \addto@pscode{closepath}% \end@ClosedObj} \def\testqp@polygon{% \ifdim\pslinearc>\z@\else \ifshowpoints\else \@psttrue \fi \fi} % \def\beginqp@dots{% \psk@dotsize \@nameuse{psds@\psk@dotstyle} % DG/SR modification begin - Dec. 12, 1999 - Patch 2 % /TheDot { gsave \psk@dotangle \psk@dotscale Dot grestore } def % TheDot } Dot } %\def\doqp@dots{TheDot } \def\doqp@dots{Dot } % DG/SR modification end \def\endqp@dots{\end@SpecialObj} \def\testqp@dots{\@psttrue} % \def\beginqp@bezier{/n 0 def \pst@oplineto} \def\doqp@bezier{/n n 1 add def n 3 mod 0 eq { % we need 3 points dup \psk@yMaxValue\space \pst@number\psyunit mul gt { moveto pop pop pop pop} { dup \psk@yMinValue\space \pst@number\psyunit mul lt { moveto pop pop pop pop}{ curveto } ifelse } ifelse } if } \def\endqp@bezier{% \addto@pscode{n 3 mod { pop pop } repeat} \end@OpenObj}% \def\testqp@bezier{% \ifshowpoints\else \ifx\psk@arrowA\@empty \ifx\psk@arrowB\@empty \@psttrue \fi \fi \fi} % \def\beginqp@cbezier{/n 0 def moveto } \def\doqp@cbezier{\doqp@bezier} \def\endqp@cbezier{% \addto@pscode{n 3 mod { pop pop } repeat closepath} \end@ClosedObj}% \def\testqp@cbezier{\ifshowpoints\else\@psttrue\fi} % % added 2007-06-26 (hv) ------------------------------------------------- \def\tx@LineToYAxis{LineToYAxis } \def\psLineToYAxis@ii{% \addto@pscode{\pst@cp \psline@iii \psk@Ox\space \pst@number\psxunit mul \tx@LineToYAxis}% \end@OpenObj} % \def\tx@LineToXAxis{LineToXAxis } \def\psLineToXAxis@ii{% \addto@pscode{\pst@cp \psline@iii \psk@Oy\space \pst@number\psyunit mul \tx@LineToXAxis}% \end@OpenObj} % \define@key[psset]{pst-plot}{PSfont}[NimbusRomNo9L-Regu]{\def\psk@PSfont{/#1 }} %\define@key[psset]{pst-plot}{PSfont}[Times-Roman]{\def\psk@PSfont{/#1 }} \define@key[psset]{pst-plot}{valuewidth}[10]{\pst@getint{#1}\psk@valuewidth } \define@key[psset]{pst-plot}{fontscale}[10]{\pst@checknum{#1}\psk@fontscale } \define@key[psset]{pst-plot}{decimals}[-1]{\pst@getint{#1}\psk@decimals } \psset[pst-plot]{PSfont=NimbusRomNo9L-Regu,fontscale=10,valuewidth=10,decimals=-1} % \newdimen\psxlabelsep \newdimen\psylabelsep \define@key[psset]{pst-plot}{xlabelsep}[5pt]{\pssetlength\psxlabelsep{#1}} \define@key[psset]{pst-plot}{ylabelsep}[5pt]{\pssetlength\psylabelsep{#1}} \psset[pst-plot]{xlabelsep=5pt,ylabelsep=5pt} % \newif\ifPst@valuesStar\Pst@valuesStarfalse \newif\ifPst@xvalues\Pst@xvaluesfalse % \def\psvalues@ii{\addto@pscode{ false \tx@NArray \psvalues@iii }} \def\psvalues@iii{ \psk@PSfont findfont \psk@fontscale scalefont setfont newpath n { /yO ED /xO ED gsave \ifPst@xvalues xO \pst@number\psxunit div \else yO \pst@number\psyunit div \fi \psk@decimals 0 eq { cvi } if \psk@decimals 0 gt { 10 \psk@decimals exp dup 3 1 roll mul cvi exch div } if \psk@valuewidth string cvs /Str ED \ifPst@valuesStar Str stringwidth pop /yS \psk@fontscale def /xS ED gsave newpath xO \ifPst@xvalues \pst@number\pslabelsep add \fi yO \ifPst@xvalues \psk@fontscale 4 div sub \else \pst@number\pslabelsep add \fi moveto \ifx\psk@rot\@empty\else\psk@rot rotate \fi xS 0 rlineto 0 yS rlineto xS neg 0 rlineto 0 yS neg rlineto closepath 1 setgray fill stroke grestore \fi xO \ifPst@xvalues \pst@number\pslabelsep add \fi yO \ifPst@xvalues \psk@fontscale 4 div sub \else \pst@number\pslabelsep add \fi moveto \ifx\psk@rot\@empty\else\psk@rot rotate \fi Str show grestore } repeat }% \def\beginplot@values{\Pst@valuesStarfalse\begin@SpecialObj} \expandafter\def\csname beginplot@values*\endcsname{\Pst@valuesStartrue\begin@SpecialObj} \def\beginplot@xvalues{\Pst@valuesStarfalse\begin@SpecialObj} \expandafter\def\csname beginplot@xvalues*\endcsname{\Pst@valuesStartrue\begin@SpecialObj} \def\endplot@values{% \Pst@xvaluesfalse% \psvalues@ii% \pst@stroke \end@SpecialObj} \@namedef{endplot@values*}{\endplot@values} \def\endplot@xvalues{% \Pst@xvaluestrue% \psvalues@ii% \pst@stroke \end@SpecialObj} \@namedef{endplot@xvalues*}{\endplot@xvalues} % % end (hv) -------------------------------------------------------------- % % \def\psdataplot{\def\pst@par{}\pst@object{dataplot}} \def\dataplot{\def\pst@par{}\pst@object{dataplot}} \def\dataplot@i#1{% \pst@killglue \begingroup \use@par \@pstfalse \@nameuse{testqp@\psplotstyle}% \if@pst \dataplot@ii{\addto@pscode{#1}}% \else \listplot@ii{\addto@pscode{#1}}% \fi \endgroup \ignorespaces} % \def\dataplot@ii#1{% \@nameuse{beginplot@\psplotstyle}% \addto@pscode{% /Dx { \pst@number\psxunit mul /D { Dy } def } def /Dy { \pst@number\psyunit mul Do /D { Dx } def } def /D { /D { Dx } def } def /Do { \@nameuse{beginqp@\psplotstyle}% /Do { \@nameuse{doqp@\psplotstyle}} def } def}% #1% % this is \pst@readfile{#1} for fileplot \addto@pscode{ D }% \@nameuse{endqp@\psplotstyle}} % \def\psfileplot{\def\pst@par{}\pst@object{fileplot}} \def\fileplot{\def\pst@par{}\pst@object{fileplot}} \def\fileplot@i#1{% \pst@killglue% \begingroup% \use@par% \@pstfalse% \@nameuse{testqp@\psplotstyle}% \if@pst\dataplot@ii{\pst@readfile{#1}}\else\listplot@ii{\pst@altreadfile{#1}}\fi% \endgroup% \ignorespaces} % \def\pslistplot{\pst@object{listplot}} \def\listplot{\pst@object{listplot}} \def\listplot@i#1{\listplot@ii{\addto@pscode{#1}}} \def\listplot@ii#1{% \@nameuse{beginplot@\psplotstyle}% \addto@pscode{/D {} def mark}% #1% \addto@pscode{ \tx@PreparePoints \pst@number\psxunit \pst@number\psyunit \tx@ScalePoints }% \@nameuse{endplot@\psplotstyle}% } % \define@boolkey[psset]{pst-plot}[Psk@]{xyValues}[true]{} \define@boolkey[psset]{pst-plot}[Pst@]{ChangeOrder}[true]{} \psset[pst-plot]{xyValues,ChangeOrder=false} % \pst@def{PreparePoints}<{% counttomark /m exch def /maxYValues \psk@plotNoMax\space def /YValuePos \psk@plotNo\space def /XValuePos \psk@plotNoX\space def /maxYvalue \ifx\empty\psk@plotYMax false \else true \fi def maxYvalue { /YMaxValue \psk@plotYMax\space def } if \ifPsk@xyValues\else % we have only y values /mm m def /M m 1 add def m { mm exch M 2 roll /M M 1 add def /mm mm 1 sub def } repeat /m m dup add def \fi \ifPst@ChangeOrder /m0 m def m maxYValues 1 add div 1 sub cvi { m0 maxYValues 1 add roll /m0 m0 maxYValues 1 add sub def } repeat \fi /n m maxYValues 1 add div cvi def % % when having multiple x values, we first delete the first X value % and then put the plotNoX onto the first position % XValuePos 1 gt {% multiple x values? x y y xNo y n { maxYValues 1 add XValuePos neg roll % y x y y xNo dup /XValue ED maxYValues 1 add XValuePos 1 sub roll % y y xNo y x pop XValue % y y xNo y xNo maxYValues 1 add 1 roll % xNo y y xNo y m maxYValues 1 add roll % next values } repeat } if % no multiple data files maxYValues 1 gt {% multiple data files? x y y yNo y n { maxYValues YValuePos 1 sub neg roll % x yNo y y y ... maxYValues 1 sub { pop } repeat % x yNo /m m maxYValues 1 sub sub def m 2 roll } repeat } if % no multiple data files % counttomark /m exch def % /n m 2 div cvi def /xMax -99999 def /yMax -99999 def /xP 0 def /yP 0 def m copy n { /y exch def /x exch def xMax x lt { /xMax x def } if yMax y lt {/yMax y def } if xP x gt { /xP x def } if yP y gt { /yP y def } if } repeat % m 2 roll \psk@xStep\space 0 gt \psk@yStep\space 0 gt or (\psk@xStart) length 0 gt or (\psk@yStart) length 0 gt or (\psk@xEnd) length 0 gt or (\psk@yEnd) length 0 gt or { % (\psk@xStart) length 0 gt {\psk@xStart\space }{ xP } ifelse /xStart exch def (\psk@yStart) length 0 gt {\psk@yStart\space }{ yP } ifelse /yStart exch def (\psk@xEnd) length 0 gt { \psk@xEnd\space }{ xMax } ifelse /xEnd exch def (\psk@yEnd) length 0 gt { \psk@yEnd\space }{ yMax } ifelse /yEnd exch def n { m -2 roll 2 copy /yVal exch def /xVal exch def xVal xP ge yVal yP ge and xVal xEnd le and yVal yEnd le and xVal xStart ge and yVal yStart ge and { /xP xP \psk@xStep\space add def /yP yP \psk@yStep\space add def }{% pop pop /m m 2 sub def } ifelse } repeat }{% /ncount 1 def (\psk@nEnd) length 0 gt { \psk@nEnd\space }{ m } ifelse /nEnd exch def n { m -2 roll \psk@nStep\space 1 gt { ncount \psk@nStart\space sub \psk@nStep\space mod 0 eq }{ true } ifelse ncount nEnd le and ncount \psk@nStart\space ge and not { % ncount nEnd le and % ncount \psk@nStart\space ge and not { pop pop /m m 2 sub def } if /ncount ncount 1 add def } repeat } ifelse maxYvalue { % delete values gt YMaxValue /m0 m def n { dup YMaxValue gt { pop pop /m m 2 sub def } if m -2 roll } repeat } if }> % % \psplot % D.G. addition - Jun. 9, 1998 - Polar plots using the \psplot macro % Code added according the way suggested by Ulrich Dirr % For polar plots \define@boolkey[psset]{pst-plot}[Pst@]{polarplot}[true]{} \define@boolkey[psset]{pst-plot}[Pst@]{VarStep}[true]{} \define@key[psset]{pst-plot}{PlotDerivative}{\def\psk@PlotDerivative{#1}}% \define@key[psset]{pst-plot}{VarStepEpsilon}{\def\psk@VarStepEpsilon{#1}}% \define@key[psset]{pst-plot}{method}{\def\psk@method{#1}}% adams - rk4 \def\@rkiv{rk4}% Runge-Kutta 4 method \def\@varrkiv{varrkiv}% Runge-Kutta 4 with an adaptive step method \def\@adams{adams}% Adams method \def\@default{default}% Adams method \psset[pst-plot]{VarStep=false,PlotDerivative=none,VarStepEpsilon=default,polarplot=false,method={}} % \def\psplotinit#1{\xdef\psplot@init{#1 }} \def\psplot@init{} % \def\psplot{\def\pst@par{}\pst@object{psplot}} \def\psplot@i#1#2{\@ifnextchar[{\psplot@x{#1}{#2}}{\psplot@x{#1}{#2}[]}} \def\psplot@x#1#2[#3]#4{% \pst@killglue \begingroup \use@par \@nameuse{beginplot@\psplotstyle}% \ifPst@polarplot \addto@pscode{ \psplot@init #3 /x #1 def /x1 #2 def /dx x1 x sub \psk@plotpoints div def /F@pstplot \ifPst@algebraic (#4) \ifx\psk@PlotDerivative\@none\else \psk@PlotDerivative\space { (x) tx@Derive begin Derive end } repeat \fi\space tx@AlgToPs begin AlgToPs end cvx \else { #4 } \fi def \ifPst@VarStep /StillZero 0 def /LastNonZeroStep dx def /F2@pstplot tx@Derive begin (#4) (x) Derive (x) Derive end \ifx\psk@PlotDerivative\@none\else \psk@PlotDerivative\space { (x) tx@Derive begin Derive end } repeat \fi\space tx@AlgToPs begin AlgToPs end cvx def %% computation of the tolerance defined by plotpoints /epsilon12 \ifx\psk@VarStepEpsilon\@default tx@Derive begin F2@pstplot end dx 3 exp abs mul abs \else\psk@VarStepEpsilon\space 12 mul \fi def /ComputeStep { dup 1e-4 lt { pop StillZero 2 ge { LastNonZeroStep 2 mul } { LastNonZeroStep } ifelse /StillZero StillZero 1 add def } { epsilon12 exch div 1 3 div exp /StillZero 0 def } ifelse } bind def \fi /xy {% Adapted from \parametricplot@i F@pstplot x \ifPst@algebraic RadtoDeg \fi PtoC % #4 dup x cos mul exch x sin mul \pst@number\psyunit mul exch \pst@number\psxunit mul exch } def}% \else% polarplot \addto@pscode{ \psplot@init #3 /x #1 def /x1 #2 def /dx x1 x sub \psk@plotpoints div def /F@pstplot \ifPst@algebraic (#4) \ifx\psk@PlotDerivative\@none\else \psk@PlotDerivative\space { (x) tx@Derive begin Derive end } repeat \fi\space tx@AlgToPs begin AlgToPs end cvx \else { #4 } \fi def \ifPst@VarStep /StillZero 0 def /LastNonZeroStep dx def /F2@pstplot tx@Derive begin (#4) (x) Derive (x) Derive end \ifx\psk@PlotDerivative\@none\else \psk@PlotDerivative\space { (x) tx@Derive begin Derive end } repeat \fi\space tx@AlgToPs begin AlgToPs end cvx def %% computation of the tolerance defined by plotpoints /epsilon12 \ifx\psk@VarStepEpsilon\@default tx@Derive begin F2@pstplot end dx 3 exp abs mul abs \else\psk@VarStepEpsilon\space 12 mul \fi def /ComputeStep { dup 1e-4 lt { pop StillZero 2 ge { LastNonZeroStep 2 mul } { LastNonZeroStep } ifelse /StillZero StillZero 1 add def } { epsilon12 exch div 1 3 div exp /StillZero 0 def } ifelse } bind def \fi /xy { x \pst@number\psxunit mul F@pstplot \pst@number\psyunit mul % \ifPst@algebraic F@pstplot \else #4 \fi \pst@number\psyunit mul } def}% \fi \gdef\psplot@init{}% \ifx\pslinestyle\psls@@symbol \psplot@iii \else \@pstfalse \@nameuse{testqp@\psplotstyle}% \if@pst\psplot@ii\else\psplot@iii\fi \fi \endgroup \ignorespaces} % \def\psplot@ii{% \ifPst@VarStep% \addto@pscode{% mark xy \@nameuse{beginqp@\psplotstyle} { F2@pstplot abs ComputeStep x 2 copy add dup x1 gt {pop x1} if /x exch def F2@pstplot abs ComputeStep /x 3 -1 roll def 2 copy gt { exch } if pop /x x 3 -1 roll add dup x1 gt {pop x1} if def xy \@nameuse{doqp@\psplotstyle} x x1 eq { exit } if} loop}% \else \pst@killglue% \addto@pscode{ /ps@Exit false def xy \@nameuse{beginqp@\psplotstyle} \ifx\psk@method\@varrkiv\else\psk@plotpoints 1 sub \fi { /x x dx add \ifx\psk@method\@varrkiv dup x1 gt { pop x1 } if \fi def xy \@nameuse{doqp@\psplotstyle} \ifx\psk@method\@varrkiv x x1 eq { exit } if \fi } ps@Exit { exit } if \ifx\psk@method\@varrkiv loop \else repeat \fi ps@Exit not { /x x1 def xy \@nameuse{doqp@\psplotstyle} } if }% \fi% \@nameuse{endqp@\psplotstyle}} % \def\psplot@iii{% \ifPst@VarStep% \addto@pscode{ /n 2 def mark { xy n 2 roll F2@pstplot abs ComputeStep x 2 copy add dup x1 gt {pop x1} if /x exch def F2@pstplot abs ComputeStep /x 3 -1 roll def 2 copy gt { exch } if pop /x x 3 -1 roll dup /LastNonZeroStep exch def add dup x1 gt {pop x1} if def /n n 2 add def x x1 eq { exit } if } loop xy n 2 roll}% \else\pst@killglue% \addto@pscode{ mark /n 2 def \ifx\psk@method\@varrkiv\else\psk@plotpoints\fi { xy n 2 roll /n n 2 add def /x x dx add \ifx\psk@method\@varrkiv dup x1 gt { pop x1 } if \fi def \ifx\psk@method\@varrkiv x x1 eq { exit } if \fi } \ifx\psk@method\@varrkiv loop\else repeat \fi \space /x x1 def xy 2 copy \tx@UserCoor 2 array astore /FinalState ED n 2 roll}% \fi% \@nameuse{endplot@\psplotstyle}} % \def\psparametricplot{\pst@object{parametricplot}}% hv 2008-11-22 \def\parametricplot{\pst@object{parametricplot}} \def\parametricplot@i#1#2{\@ifnextchar[{\parametricplot@x{#1}{#2}}{\parametricplot@x{#1}{#2}[]}} \def\parametricplot@x#1#2[#3]{\@ifnextchar[{\parametricplot@xi{#1}{#2}[#3]}{\parametricplot@xi{#1}{#2}[#3][]}} \def\parametricplot@xi#1#2[#3][#4]#5{% \pst@killglue% \begingroup% \use@par% \@nameuse{beginplot@\psplotstyle}% \addto@pscode{% #3 %prefix PS code \psplot@init /t #1 def /t1 #2 def /dt t1 t sub \psk@plotpoints div def /F@pstplot \ifPst@algebraic (#5) \ifx\psk@PlotDerivative\@none\else \psk@PlotDerivative\space { (t) tx@Derive begin Derive end } repeat \fi\space tx@AlgToPs begin AlgToPs end cvx \else { #5 } \fi def \ifPst@VarStep /StillZero 0 def /LastNonZeroStep dt def /F2@pstplot tx@Derive begin (#5) (t) Derive (t) Derive end \ifx\psk@PlotDerivative\@none\else \psk@PlotDerivative\space { (t) tx@Derive begin Derive end } repeat \fi\space tx@AlgToPs begin AlgToPs end cvx def %% computation of the tolerance defined by plotpoints /epsilon12 \ifx\psk@VarStepEpsilon\@default tx@Derive begin F2@pstplot end Pyth dt 3 exp abs mul \else\psk@VarStepEpsilon\space 12 mul \fi def /ComputeStep { dup 1e-4 lt { pop StillZero 2 ge { LastNonZeroStep 2 mul } { LastNonZeroStep } ifelse /StillZero StillZero 1 add def } { epsilon12 exch div 1 3 div exp /StillZero 0 def } ifelse } bind def \fi /xy { \ifPst@algebraic F@pstplot \else #5 \fi \pst@number\psyunit mul exch \pst@number\psxunit mul exch } def }% \gdef\psplot@init{}% \@pstfalse \@nameuse{testqp@\psplotstyle}% \if@pst\parametricplot@ii{#4}\else\parametricplot@iii{#4}\fi \endgroup% \ignorespaces} % \def\parametricplot@ii#1{% para is the post code \ifPst@VarStep% \addto@pscode{% mark xy \@nameuse{beginqp@\psplotstyle} { F2@pstplot Pyth ComputeStep t 2 copy add dup t1 gt {pop t1} if /t exch def F2@pstplot Pyth ComputeStep /t 3 -1 roll def 2 copy gt { exch } if pop /t t 3 -1 roll add dup t1 gt {pop t1} if def xy \@nameuse{doqp@\psplotstyle} t t1 eq { exit } if } loop}% \else\pst@killglue% \addto@pscode{% /ps@Exit false def xy \@nameuse{beginqp@\psplotstyle} \psk@plotpoints 1 sub { /t t dt add def xy \@nameuse{doqp@\psplotstyle} ps@Exit { exit } if } repeat ps@Exit not { /t t1 def xy \@nameuse{doqp@\psplotstyle} } if }% \fi% \addto@pscode{ #1 }% \@nameuse{endqp@\psplotstyle}} % \def\parametricplot@iii#1{% \ifPst@VarStep% \addto@pscode{% /n 2 def mark { xy n 2 roll F2@pstplot Pyth ComputeStep t 2 copy add dup t1 gt {pop t1} if /t exch def F2@pstplot Pyth ComputeStep /t 3 -1 roll def 2 copy gt { exch } if pop /t t 3 -1 roll dup /LastNonZeroStep exch def add dup t1 gt {pop t1} if def /n n 2 add def t t1 eq { exit } if } loop xy 2 copy \tx@UserCoor 2 array astore /FinalState ED n 2 roll}% \else\pst@killglue% \addto@pscode{ mark /n 2 def \psk@plotpoints { xy n 2 roll /n n 2 add def /t t dt add def } repeat /t t1 def xy n 2 roll}% \fi% \addto@pscode{ #1 }% \@nameuse{endplot@\psplotstyle}} % % \newdimen\psk@subticksize\psk@subticksize=\z@ \newdimen\pst@xticksizeA \newdimen\pst@xticksizeB \newdimen\pst@xticksizeC \newdimen\pst@yticksizeA \newdimen\pst@yticksizeB \newdimen\pst@yticksizeC % \define@key[psset]{pst-plot}{ticks}[all]{\pst@expandafter\psset@@ticks{#1}\@nil\psk@ticks} \def\psset@@ticks#1#2\@nil#3{% \ifx#1a\let#3\z@\else% 0=a)ll \ifx#1x\let#3\@ne\else% 1=x \ifx#1y\let#3\tw@\else% 2=y \ifx#1n\let#3\thr@@\else% 3=n)one \@pstrickserr{Bad argument: `#1#2'}\@ehpa \fi\fi\fi\fi} \psset[pst-plot]{ticks=all} % \define@key[psset]{pst-plot}{labels}[all]{\pst@expandafter\psset@@ticks{#1}\@nil\psk@labels}% same as ticks \psset[pst-plot]{labels=all} % \define@key[psset]{pst-plot}{Ox}[0]{\def\psk@Ox{#1}} \psset[pst-plot]{Ox=0} \define@key[psset]{pst-plot}{Dx}[1]{\def\psk@Dx{#1}} \psset[pst-plot]{Dx=1} \define@key[psset]{pst-plot}{dx}[0]{% \pssetxlength\pst@dimg{#1}% \edef\psk@dx{\number\pst@dimg}} \psset[pst-plot]{dx=0} % \define@key[psset]{pst-plot}{Oy}[0]{\def\psk@Oy{#1}} \psset[pst-plot]{Oy=0} \define@key[psset]{pst-plot}{Dy}[1]{\def\psk@Dy{#1}} \psset[pst-plot]{Dy=1} \define@key[psset]{pst-plot}{dy}[0]{% \pssetylength\pst@dimg{#1}% \edef\psk@dy{\number\pst@dimg}} \psset[pst-plot]{dy=0} % \define@boolkey[psset]{pst-plot}[]{showXorigin}[true]{} \define@boolkey[psset]{pst-plot}[]{showYorigin}[true]{} \define@boolkey[psset]{pst-plot}[]{showorigin}[true]{% \ifshoworigin \showXorigintrue\showYorigintrue \else \showXoriginfalse\showYoriginfalse \fi } \psset[pst-plot]{showorigin=true} % \long\def\psrotatebox#1#2{% \leavevmode \Grot@setangle{#1}% \setbox\z@\hbox{{#2}}% \Grot@x\z@ \Grot@y\z@ \Grot@box} \def\Grot@setangle#1{\edef\Grot@angle{#1}} \def\Grot@Px#1#2#3{% #1\Grot@cos#2% \advance#1-\Grot@sin#3} \def\Grot@Py#1#2#3{% #1\Grot@sin#2% \advance#1\Grot@cos#3} \def\Grot@box{% \begingroup \CalculateSin\Grot@angle \CalculateCos\Grot@angle \edef\Grot@sin{\UseSin\Grot@angle}% \edef\Grot@cos{\UseCos\Grot@angle}% \Grot@r\wd\z@ \advance\Grot@r-\Grot@x \Grot@l\z@ \advance\Grot@l-\Grot@x \Grot@h\ht\z@ \advance\Grot@h-\Grot@y \Grot@d-\dp\z@ \advance\Grot@d-\Grot@y \ifdim\Grot@sin\p@>\z@ \ifdim\Grot@cos\p@>\z@ \Grot@Py\Grot@height \Grot@r\Grot@h%B \Grot@Px\Grot@right \Grot@r\Grot@d%E \Grot@Px\Grot@left \Grot@l\Grot@h%C \Grot@Py\Grot@depth \Grot@l\Grot@d%D \else \Grot@Py\Grot@height \Grot@r\Grot@d%E \Grot@Px\Grot@right \Grot@l\Grot@d%D \Grot@Px\Grot@left \Grot@r\Grot@h%B \Grot@Py\Grot@depth \Grot@l\Grot@h%C \fi \else \ifdim\Grot@cos\p@<\z@ \Grot@Py\Grot@height \Grot@l\Grot@d%D \Grot@Px\Grot@right \Grot@l\Grot@h%C \Grot@Px\Grot@left \Grot@r\Grot@d%E \Grot@Py\Grot@depth \Grot@r\Grot@h%B \else \Grot@Py\Grot@height \Grot@l\Grot@h%C \Grot@Px\Grot@right \Grot@r\Grot@h%B \Grot@Px\Grot@left \Grot@l\Grot@d%D \Grot@Py\Grot@depth \Grot@r\Grot@d%E \fi \fi \advance\Grot@height\Grot@y \advance\Grot@depth\Grot@y \Grot@Px\dimen@ \Grot@x\Grot@y \Grot@Py\dimen@ii \Grot@x\Grot@y \dimen@-\dimen@ \advance\dimen@-\Grot@left \dimen@ii-\dimen@ii \advance\dimen@ii\Grot@y \setbox\z@\hbox{% \kern\dimen@ \raise\dimen@ii\hbox{\Grot@start\box\z@\Grot@end}}% \ht\z@\Grot@height \dp\z@-\Grot@depth \advance\Grot@right-\Grot@left\wd\z@\Grot@right \leavevmode\box\z@ \endgroup} % \define@key[psset]{pst-plot}{labelFontSize}[{}]{\def\psk@xlabelFontSize{#1}\def\psk@ylabelFontSize{#1}}% \define@key[psset]{pst-plot}{xlabelFontSize}[{}]{\def\psk@xlabelFontSize{#1}}% \define@key[psset]{pst-plot}{ylabelFontSize}[{}]{\def\psk@ylabelFontSize{#1}}% \define@boolkey[psset]{pst-plot}[Pst@]{mathLabel}[true]{% \ifPst@mathLabel% \Pst@xmathLabeltrue \Pst@ymathLabeltrue \def\pshlabel##1{$\psk@xlabelFontSize##1$}% \def\psvlabel##1{$\psk@ylabelFontSize##1$}% \else% \Pst@xmathLabelfalse \Pst@ymathLabelfalse \def\pshlabel##1{\psk@xlabelFontSize##1}% \def\psvlabel##1{\psk@ylabelFontSize##1}% \fi} \define@boolkey[psset]{pst-plot}[Pst@]{xmathLabel}[true]{% \ifPst@xmathLabel% \def\pshlabel##1{$\psk@xlabelFontSize##1$}\else\def\pshlabel##1{\psk@xlabelFontSize##1}\fi} \define@boolkey[psset]{pst-plot}[Pst@]{ymathLabel}[true]{% \ifPst@ymathLabel% \def\psvlabel##1{$\psk@ylabelFontSize##1$}\else\def\psvlabel##1{\psk@ylabelFontSize##1}\fi} \psset[pst-plot]{labelFontSize={},mathLabel} % \define@boolkey[psset]{pst-plot}[Pst@]{xAxis}[true]{} \define@boolkey[psset]{pst-plot}[Pst@]{yAxis}[true]{} \define@boolkey[psset]{pst-plot}[Pst@]{xyAxes}[true]{% \@nameuse{Pst@xAxis#1}\@nameuse{Pst@yAxis#1}}% \psset[pst-plot]{xAxis,yAxis}% % \define@key[psset]{pst-plot}{xlabelPos}[b]{\pst@expandafter\psset@@xlabelPos#1\@nil} \define@key[psset]{pst-plot}{ylabelPos}[l]{\pst@expandafter\psset@@ylabelPos#1\@nil} \def\psset@@xlabelPos#1#2\@nil{% \ifx#1t\relax \let\psk@xlabelPos\tw@% 2=top \pst@xticksizeC=\pst@xticksizeB \else \ifx#1a\relax \let\psk@xlabelPos\@ne % 1=axis \pst@xticksizeC=\z@ \else \def\psk@xlabelPos{\z@}% 0=bottom \pst@xticksizeC=\pst@xticksizeA \fi\fi } \def\psset@@ylabelPos#1#2\@nil{% \ifx#1r\relax \def\psk@ylabelPos{\tw@}% 2=right \pst@yticksizeC=\pst@yticksizeB \else \ifx#1a\relax \def\psk@ylabelPos{\@ne}% 1=axis \pst@yticksizeC=\z@ \else \def\psk@ylabelPos{\z@}% 0=left \pst@yticksizeC=\pst@yticksizeA \fi\fi } \psset[pst-plot]{xlabelPos=b, ylabelPos=l}% % \define@key[psset]{pst-plot}{xyDecimals}[{}]{\def\psk@xDecimals{#1}\def\psk@yDecimals{#1}} \define@key[psset]{pst-plot}{xDecimals}[{}]{\def\psk@xDecimals{#1}} \define@key[psset]{pst-plot}{yDecimals}[{}]{\def\psk@yDecimals{#1}} \psset[pst-plot]{xyDecimals={}}% % \define@key[psset]{pst-plot}{xlogBase}[{}]{\def\psk@xlogBase{#1}} \define@key[psset]{pst-plot}{ylogBase}[{}]{\def\psk@ylogBase{#1}} \define@key[psset]{pst-plot}{xylogBase}[{}]{\def\psk@xlogBase{#1}\def\psk@ylogBase{#1}}% \psset[pst-plot]{xylogBase={}}% % \define@key[psset]{pst-plot}{trigLabelBase}[0]{\pst@getint{#1}{\psk@xtrigLabelBase}\let\psk@ytrigLabelBase\psk@xtrigLabelBase} \define@key[psset]{pst-plot}{xtrigLabelBase}[0]{% \pst@getint{#1}{\psk@xtrigLabelBase}\psset{xtrigLabels}} \define@key[psset]{pst-plot}{ytrigLabelBase}[0]{% \pst@getint{#1}{\psk@ytrigLabelBase}\psset{ytrigLabels}} \psset[pst-plot]{trigLabelBase=0} % \define@key[psset]{pst-plot}{fractionLabelBase}[0]{\pst@getint{#1}{\psk@xfractionLabelBase}\let\psk@yfractionLabelBase\psk@xfractionLabelBase} \define@key[psset]{pst-plot}{xfractionLabelBase}[0]{% \pst@getint{#1}{\psk@xfractionLabelBase}\psset{xfractionLabels}} \define@key[psset]{pst-plot}{yfractionLabelBase}[0]{% \pst@getint{#1}{\psk@yfractionLabelBase}\psset{yfractionLabels}} \psset[pst-plot]{fractionLabelBase=0} % \def\setDefaulthLabels{% \ifPst@xmathLabel\def\pshlabel##1{$\psk@xlabelFontSize##1$}\else\def\pshlabel##1{\psk@xlabelFontSize##1}\fi \def\pst@@@hlabel##1{% \edef\@xyDecimals{\psk@xDecimals}% % \ifnum\psk@ticks<\tw@ % ticks=all|x \ifnum\psk@labels<\tw@\relax% labels=all|x \ifx\psk@xlogBase\@empty \pshlabel{\psk@xlabelFontSize\expandafter\@LabelComma##1..\@nil\psk@xlabelFactor}% \else \ifPst@xmathLabel \pshlabel{\psk@xlabelFontSize\psk@xlogBase^{\expandafter\@stripDecimals##1..\@nil}}% \else \pshlabel{\psk@xlabelFontSize\psk@xlogBase\textsuperscript{\expandafter\@stripDecimals##1..\@nil}}% \fi \fi \fi }% \ifPst@xmathLabel\def\pshlabel##1{$\psk@xlabelFontSize##1$}\else\def\pshlabel##1{\psk@xlabelFontSize##1}\fi } \def\setTrighLabels{% \def\pst@@@hlabel##1{\pshlabel{##1}}% \def\pshlabel##1{% \ifnum\psk@xtrigLabelBase<2 \def\de@nominator{\@ne}\else\def\de@nominator{\psk@xtrigLabelBase}\fi \def\pst@tempA{##1}% \pst@abs{\pst@tempA}\pst@cntm \pst@mod{\pst@cntm}{\de@nominator}\pst@cntp % cntb=##1 modulo trigLabelBase \ifnum\@ne>\pst@cntp % 1 > modulo -> then we have pi/x \pst@cnto=\pst@cntm \divide\pst@cnto by \de@nominator \ifPst@xmathLabel $\psk@xlabelFontSize \ifnum\pst@tempA<0 -\fi \ifnum\pst@cnto=\@ne % #1 = trigLabelBase \pi % print pi \else \ifnum\pst@cnto=\z@ 0\else \the\pst@cnto\pi % print \pst@cnto/\de@nominator pi \fi\fi$% \else% \psk@xlabelFontSize \ifnum\pst@tempA<0 -\fi \ifnum\pst@cnto=\@ne% % #1 = trigLabelBase $\pi$% % print pi \else% \the\pst@cnto$\pi$% % print \pst@cnto/\de@nominator pi \fi% \fi% \else% \ifPst@xmathLabel% $\psk@xlabelFontSize% \ifnum\pst@cntp=\@ne% % < 1 pi? \if\pst@cntm=\@ne% \frac{\pi}{\de@nominator}% % pi/x \else\ifnum\pst@tempA=-1 \frac{-\pi}{\de@nominator}% \else \ifnum\pst@tempA=1 \frac{\pi}{\de@nominator}% \else\frac{\pst@tempA\pi}{\de@nominator}% (x pi)/y \fi\fi\fi% \else% \ifnum\pst@tempA=1 \frac{\pi}{\de@nominator}% \else\ifnum\pst@tempA=\de@nominator \pi% \else\frac{\pst@tempA\pi}{\de@nominator}% \fi\fi\fi$% \else% \psk@xlabelFontSize% \ifnum\pst@cntp=\@ne% % < 1 pi? \if\pst@cntm=\@ne% $\frac{\pi}{\de@nominator}$% % pi/x \else\ifnum\pst@tempA=-1 $\frac{-\pi}{\de@nominator}$% \else \ifnum\pst@tempA=1 $\frac{\pi}{\de@nominator}$% \else$\frac{\pst@tempA\pi}{\de@nominator}$% (x pi)/y \fi\fi\fi \else \ifnum\pst@tempA=1 $\frac{\pi}{\de@nominator}$% \else\ifnum\pst@tempA=\de@nominator $\pi$% \else$\frac{\pst@tempA\pi}{\de@nominator}$% \fi\fi\fi \fi \fi }% } % \def\setDefaultvLabels{% \ifPst@ymathLabel\def\psvlabel##1{$\psk@ylabelFontSize##1$}\else\def\psvlabel##1{\psk@ylabelFontSize##1}\fi \def\pst@@@vlabel##1{% \edef\@xyDecimals{\psk@yDecimals}% % \ifodd\psk@ticks % ticks=all||y (0,2) \ifodd\psk@labels % labelss=all||y (0,2) \else% \ifx\psk@ylogBase\@empty \psvlabel{\expandafter\@LabelComma##1..\@nil\psk@ylabelFactor}% \else% \ifPst@ymathLabel% \psvlabel{\psk@ylogBase^{\expandafter\@stripDecimals##1..\@nil }}% \else \psvlabel{\psk@ylogBase\textsuperscript{\expandafter\@stripDecimals##1..\@nil }}% \fi% \fi% \fi% }% }% \def\setTrigvLabels{% \def\pst@@@vlabel##1{\psvlabel{##1}}% \def\psvlabel##1{% \ifnum\psk@ytrigLabelBase<2 \def\de@nominator{\@ne}\else\def\de@nominator{\psk@ytrigLabelBase}\fi \def\pst@tempA{##1} \pst@abs{\pst@tempA}\pst@cntm \pst@mod{\pst@cntm}{\de@nominator}\pst@cntp % cntb=##1 modulo trigLabelBase \ifnum\@ne>\pst@cntp % 1 > modulo -> then we have pi/x \pst@cnto=\pst@cntm \divide\pst@cnto by \de@nominator \ifPst@ymathLabel% $\psk@ylabelFontSize \ifnum\pst@tempA<0 -\fi \ifnum\pst@cnto=\@ne % #1 = trigLabelBase \pi % print pi \else \the\pst@cnto\pi % print \pst@cnto/\de@nominator pi \fi$% \else% \psk@ylabelFontSize% \ifnum\pst@tempA<0 -\fi \ifnum\pst@cnto=\@ne% % #1 = trigLabelBase $\pi$% % print pi \else \the\pst@cnto$\pi$% % print \pst@cnto/\de@nominator pi \fi \fi \else \ifPst@ymathLabel% $\psk@ylabelFontSize \ifnum\pst@cntp=\@ne% % < 1 pi? $ \if\pst@cntm=\@ne% \frac{\pi}{\de@nominator}% % pi/x \else\ifnum\pst@tempA=-1 \frac{-\pi}{\de@nominator}% \else \ifnum\pst@tempA=1 \frac{\pi}{\de@nominator}% \else\frac{\pst@tempA\pi}{\de@nominator}% (x pi)/y \fi\fi\fi% \else% \ifnum\pst@tempA=1 \frac{\pi}{\de@nominator}% \else\ifnum\pst@tempA=\de@nominator \pi% \else\frac{\pst@tempA\pi}{\de@nominator}% \fi\fi\fi$% \else \psk@ylabelFontSize \ifnum\pst@cntp=\@ne% % < 1 pi? \if\pst@cntm=\@ne $\frac{\pi}{\de@nominator}$% % pi/x \else\ifnum\pst@tempA=-1 $\frac{-\pi}{\de@nominator}$% \else \ifnum\pst@tempA=1 $\frac{\pi}{\de@nominator}$% \else$\frac{\pst@tempA\pi}{\de@nominator}$% (x pi)/y \fi\fi\fi \else \ifnum\pst@tempA=1 $\frac{\pi}{\de@nominator}$% \else\ifnum\pst@tempA=\de@nominator $\pi$% \else$\frac{\pst@tempA\pi}{\de@nominator}$% \fi\fi\fi \fi \fi }% }%$ % \def\setFractionvLabels{% \def\pst@@@vlabel##1{\psvlabel{##1}}% \def\psvlabel##1{% \ifnum\psk@yfractionLabelBase<2 \def\de@nominator{\@ne}\else\def\de@nominator{\psk@yfractionLabelBase}\fi \def\pst@tempA{##1}% \pst@abs{\pst@tempA}\pst@cntm \pst@mod{\pst@cntm}{\de@nominator}\pst@cntp % cntb=##1 modulo trigLabelBase \ifnum\@ne>\pst@cntp % 1 > modulo -> then we have pi/x \pst@cnto=\pst@cntm \divide\pst@cnto by \de@nominator \ifPst@ymathLabel$\psk@ylabelFontSize\ifnum\pst@tempA<0 -\fi\the\pst@cnto\psk@ylabelFactor$% \else \psk@ylabelFontSize\ifnum\pst@tempA<0 -\fi\the\pst@cnto\psk@ylabelFactor \fi \else \ifPst@ymathLabel $\psk@ylabelFontSize \ifnum\pst@cntp=\@ne % < 1? $ \if\pst@cntm=\@ne \frac{1}{\de@nominator}\psk@ylabelFactor% % 1/x \else\ifnum\pst@tempA=-1 \frac{-1}{\de@nominator}\psk@ylabelFactor% \else \ifnum\pst@tempA=1 \frac{1}{\de@nominator}\psk@ylabelFactor% \else\frac{\pst@tempA}{\de@nominator}\psk@ylabelFactor% x/y \fi\fi\fi \else \ifnum\pst@tempA=1 \frac{1}{\de@nominator}\psk@ylabelFactor% \else\ifnum\pst@tempA=\de@nominator 1\psk@xlabelFactor \else\frac{\pst@tempA}{\de@nominator}\psk@ylabelFactor% \fi\fi\fi$ \else \psk@ylabelFontSize \ifnum\pst@cntp=\@ne% % < 1? \if\pst@cntm=\@ne $\frac{1}{\de@nominator}\psk@ylabelFactor$% % 1/x \else\ifnum\pst@tempA=-1 $\frac{-1}{\de@nominator}\psk@ylabelFactor$% \else \ifnum\pst@tempA=1 $\frac{1}{\de@nominator}\psk@ylabelFactor$% \else$\frac{\pst@tempA}{\de@nominator}\psk@ylabelFactor$% x/y \fi\fi\fi% \else% \ifnum\pst@tempA=1 $\frac{1}{\de@nominator}\psk@ylabelFactor$% \else\ifnum\pst@tempA=\de@nominator 1\psk@ylabelFactor \else$\frac{\pst@tempA}{\de@nominator}\psk@ylabelFactor$% %$ \fi\fi\fi \fi \fi }% }%$ \def\setFractionhLabels{% \def\pst@@@hlabel##1{\pshlabel{##1}}% \def\pshlabel##1{% \ifnum\psk@xfractionLabelBase<2 \def\de@nominator{\@ne}\else\def\de@nominator{\psk@xfractionLabelBase}\fi \def\pst@tempA{##1}% \pst@abs{\pst@tempA}\pst@cntm \pst@mod{\pst@cntm}{\de@nominator}\pst@cntp% cntb=##1 modulo trigLabelBase \ifnum\@ne>\pst@cntp % 1 > modulo -> then we have 1/x \pst@cnto=\pst@cntm \divide\pst@cnto by \de@nominator \ifPst@xmathLabel$\psk@xlabelFontSize\ifnum\pst@tempA<0 -\fi\the\pst@cnto\psk@xlabelFactor$% \else \psk@xlabelFontSize\ifnum\pst@tempA<0 -\fi\the\pst@cnto\psk@xlabelFactor \fi \else \ifPst@xmathLabel $\psk@xlabelFontSize% $ \ifnum\pst@cntp=\@ne \if\pst@cntm=\@ne \frac{1}{\de@nominator}\psk@xlabelFactor% % 1/x \else\ifnum\pst@tempA=-1 \frac{-1}{\de@nominator}\psk@xlabelFactor% \else\ifnum\pst@tempA=1 \frac{1}{\de@nominator}\psk@xlabelFactor% \else\frac{\pst@tempA}{\de@nominator}\psk@xlabelFactor% x/y \fi\fi\fi% \else% \ifnum\pst@tempA=1 \frac{1}{\de@nominator}\psk@xlabelFactor% \else\ifnum\pst@tempA=\de@nominator 1\psk@xlabelFactor\else\frac{\pst@tempA}{\de@nominator}\psk@xlabelFactor% \fi\fi\fi$ \else \psk@xlabelFontSize \ifnum\pst@cntp=\@ne \if\pst@cntm=\@ne $\frac{1}{\de@nominator}\psk@xlabelFactor$% % 1/x \else\ifnum\pst@tempA=-1 $\frac{-1}{\de@nominator}\psk@xlabelFactor$% \else \ifnum\pst@tempA=1 $\frac{1}{\de@nominator}\psk@xlabelFactor$% \else$\frac{\pst@tempA}{\de@nominator}\psk@xlabelFactor$% x/y \fi\fi\fi \else \ifnum\pst@tempA=1 $\frac{1}{\de@nominator}\psk@xlabelFactor$% \else\ifnum\pst@tempA=\de@nominator 1\psk@xlabelFactor% \else$\frac{\pst@tempA}{\de@nominator}\psk@xlabelFactor$% %$ \fi\fi\fi \fi \fi }% }%$ % \define@boolkey[psset]{pst-plot}[Pst@]{xtrigLabels}[true]{% \ifPst@xtrigLabels \setTrighLabels \else \setDefaulthLabels\fi} % \define@boolkey[psset]{pst-plot}[Pst@]{ytrigLabels}[true]{% \ifPst@ytrigLabels \setTrigvLabels \else \setDefaultvLabels \fi} % \define@boolkey[psset]{pst-plot}[Pst@]{trigLabels}[true]{% \ifPst@trigLabels\psset[pst-plot]{xtrigLabels,ytrigLabels=false} \else \psset[pst-plot]{xtrigLabels=false,ytrigLabels=false}% \fi} \psset[pst-plot]{trigLabels=false} % \define@boolkey[psset]{pst-plot}[Pst@]{xfractionLabels}[true]{% \ifPst@xfractionLabels \setFractionhLabels \else \setDefaulthLabels \fi} \define@boolkey[psset]{pst-plot}[Pst@]{yfractionLabels}[true]{% \ifPst@yfractionLabels \setFractionvLabels \else \setDefaultvLabels \fi} \define@boolkey[psset]{pst-plot}[Pst@]{fractionLabels}[true]{% \ifPst@fractionLabels \setFractionhLabels\setFractionvLabels\Pst@xfractionLabelstrue\Pst@yfractionLabelstrue\fi} \psset[pst-plot]{fractionLabels=false} % %logLines=all|x|y|none (0,1,2,3) \def\psk@logLines{3} \define@key[psset]{pst-plot}{logLines}[none]{\pst@expandafter\psset@@logLines#1\@nil\psk@logLines} \def\psset@@logLines#1#2\@nil#3{% \ifx#1a\relax \let#3\z@ \Pst@maxxTickstrue\Pst@maxyTickstrue \set@xticksize{0 4pt}\set@yticksize{0 4pt}% \def\psk@xsubticksize{1}\def\psk@ysubticksize{1}% \else \ifx#1x\relax \let#3\@ne \Pst@maxxTickstrue\Pst@maxyTicksfalse \set@xticksize{0 4pt}\def\psk@xsubticksize{1}% \else \ifx#1y\relax \let#3\tw@ \Pst@maxyTickstrue\Pst@maxxTicksfalse \set@yticksize{0 4pt}\def\psk@ysubticksize{1}% \else \ifx#1n\let#3\thr@@\else \@pstrickserr{Bad argument: `#1#2'}\@ehpa \fi\fi\fi\fi} \psset[pst-plot]{logLines=none}% % \define@key[psset]{pst-plot}{ylabelFactor}[\relax]{\def\psk@ylabelFactor{#1}} \define@key[psset]{pst-plot}{xlabelFactor}[\relax]{\def\psk@xlabelFactor{#1}} \define@boolkey[psset]{pst-plot}[Pst@]{showOriginTick}[true]{}% \psset[pst-plot]{xlabelFactor=\relax,ylabelFactor=\relax,showOriginTick}% %% #1 : optional arguments passed to psline %% #2 : rotating angle %% #3 : x value %% #4 : label \def\psxTick{\pst@object{psxTick}}% idea by Martin Chicoine \def\psxTick@i{\@ifnextchar({\psxTick@ii{0}}\psxTick@ii} \def\psxTick@ii#1(#2)#3{{% \pst@killglue \addbefore@par{arrows=-,linewidth=\psk@xtickwidth\pslinewidth} \ifPst@xtrigLabels\addto@par{xtrigLabels=false}\fi \use@par \edef\temp@coor{(!#2 \pst@number\pst@xticksizeB \pst@number\psyunit div)(!#2 \pst@number\pst@xticksizeA \pst@number\psyunit div)}% \expandafter\psline\temp@coor \rput[t]{#1}(! \psk@origin #2 \pst@number\psxlabelsep \pst@number\pst@xticksizeB add \pst@number\psyunit div neg ){\pshlabel{#3\vphantom{1}}}% }\ignorespaces} % % % %% #1 : optional arguments passed to psline and \rput %% #2 : rotating angle %% #3 : y value %% #4 : label \def\psyTick{\pst@object{psyTick}}% idea by Martin Chicoine \def\psyTick@i{\@ifnextchar({\psyTick@ii{0}}\psyTick@ii} \def\psyTick@ii#1(#2)#3{{% \pst@killglue \addbefore@par{arrows=-,linewidth=\psk@ytickwidth\pslinewidth} \ifPst@ytrigLabels \setDefaultvLabels \fi \use@par \edef\temp@coor{(!\pst@number\pst@yticksizeB \pst@number\psxunit div #2)(!\pst@number\pst@yticksizeA \pst@number\psxunit div #2)}% \expandafter\psline\temp@coor \rput[r]{#1}(!\psk@origin \pst@number\pst@yticksizeB \pst@number\psylabelsep add \pst@number\psxunit div neg #2){\psvlabel{#3}}}\ignorespaces} % \define@boolkey[psset]{pst-plot}[Pst@]{markPoint}[true]{}% \psset[pst-plot]{markPoint} % \def\psCoordinates{\pst@object{psCoordinates}} \def\psCoordinates@i(#1){% \pst@killglue% \begingroup \addbefore@par{showpoints=false,markPoint} \use@par \psline(#1|0,0)(#1)% single lines to allow arrows \psline(#1)(0,0|#1)% \ifPst@markPoint\psdot(#1)\fi% \endgroup \ignorespaces } % \def\stripDecimals#1{\expandafter\@stripDecimals#1..\@nil} %% #1 integer %% #2 decimals %% #3 dot \def\@stripDecimals#1.#2.#3\@nil{% \def\pst@dummy{#1}% \ifx\pst@dummy\@empty\the\@zero\else#1\fi% the integer part } % \newcount\@digitcounter\@digitcounter=0\relax \def\@inc@digitcounter{\global\advance\@digitcounter by 1\relax} \def\@get@digitcounter{\the\@digitcounter\relax} \def\@Reset@digitcounter{\global\@digitcounter=0\relax} \def\@zeroFill{% \ifnum \@xyDecimals>\@get@digitcounter \bgroup 0\@inc@digitcounter\@zeroFill \egroup \fi } % #1 the value, maybe empty % \def\@process@digits#1#2;{% \ifx *#1\@zeroFill\else#1\@inc@digitcounter \ifnum\@xyDecimals>\@get@digitcounter\expandafter\@process@digits#2;\fi\fi% } % \def\@writeDecimals#1{% \ifx\@xyDecimals\@empty% take value as is \def\@tempa{#1}% write only if not empty \ifx\@tempa\@empty% write nothing \else\ifmmode\expandafter\mathord\expandafter{\psk@decimalSeparator}\else\psk@decimalSeparator\fi#1\fi% % \else\psk@decimalSeparator\fi% \else% write only \xy@decimals \ifnum\@xyDecimals>\@zero \ifmmode\expandafter\mathord\expandafter{\psk@decimalSeparator}\else\psk@decimalSeparator\fi% % \psk@decimalSeparator \@Reset@digitcounter \expandafter\@process@digits#1*;% \fi% \fi% } %% #1 integer %% #2 decimals %% #3 dot \def\@LabelComma#1.#2.#3\@nil{% \def\pst@tempA{#1}% \ifx\pst@tempA\@empty\the\@zero\else#1\fi% the integer part \def\pst@tempA{#2}% \ifx\pst@tempA\@empty\@writeDecimals{}\else\@writeDecimals{#2}\fi } % % \def\set@xticksize#1{% \pst@expandafter\pst@getydimdim{#1} {} {}\@nil% y-unit!! \ifdim\pst@dimm>\pst@dimn% % first > second value \pst@xticksizeA=\the\pst@dimn% \pst@xticksizeB=\the\pst@dimm% \else% \pst@xticksizeA=\the\pst@dimm% \pst@xticksizeB=\the\pst@dimn% first > second value \fi% \edef\psk@xticksize{\pst@number\pst@xticksizeA \pst@number\pst@xticksizeB}% \ifnum\psk@xlabelPos<\z@\relax% top \pst@xticksizeC=\pst@dimn \else \pst@xticksizeC=\pst@dimm% bottom \fi } \def\set@yticksize#1{% \pst@expandafter\pst@getxdimdim{#1} {} {}\@nil% x-unit! \ifdim\pst@dimm>\pst@dimn\relax% % first > second value \pst@yticksizeA=\the\pst@dimn% \pst@yticksizeB=\the\pst@dimm% \else% \pst@yticksizeA=\the\pst@dimm% \pst@yticksizeB=\the\pst@dimn% first > second value \fi% \edef\psk@yticksize{\pst@number\pst@yticksizeA \pst@number\pst@yticksizeB}% \ifnum\psk@ylabelPos<\z@ % right \pst@yticksizeC=\pst@dimn% \else% \pst@yticksizeC=\pst@dimo% left \fi% } \newif\ifPst@maxxTicks \newif\ifPst@maxyTicks \define@key[psset]{pst-plot}{ticksize}[-4pt 4pt]{% \def\pst@tempA{max}% \def\pst@tempB{#1}% \ifx\pst@tempA\pst@tempB% \Pst@maxxTickstrue\Pst@maxyTickstrue% \set@xticksize{0 4pt}\set@yticksize{0 4pt}% \else% \Pst@maxxTicksfalse\Pst@maxyTicksfalse% \set@xticksize{#1}\set@yticksize{#1}% \fi} \define@key[psset]{pst-plot}{xticksize}{% \def\pst@tempA{max}% \def\pst@tempB{#1}% \ifx\pst@tempA\pst@tempB \Pst@maxxTickstrue\set@xticksize{0 4pt}% \else\set@xticksize{#1}\Pst@maxxTicksfalse\fi} \define@key[psset]{pst-plot}{yticksize}{% \def\pst@tempA{max}% \def\pst@tempB{#1}% \ifx\pst@tempA\pst@tempB% \Pst@maxyTickstrue\set@yticksize{0 4pt}% \else\set@yticksize{#1}\Pst@maxyTicksfalse\fi}% \psset[pst-plot]{ticksize=-4pt 4pt} % % full= 0, top=1, bottom=-1, inner=2 => -1 0 1 2 \define@key[psset]{pst-plot}{tickstyle}[full]{\pst@expandafter\psset@@tickstyle{#1}\@nil} \def\psset@@tickstyle#1#2\@nil{% \ifx#1f\let\psk@tickstyle\z@\else % 0=f)ull \ifx#1t\let\psk@tickstyle\@ne % 1=t)op \edef\psk@xticksize{0 \pst@number\pst@xticksizeB}% \edef\psk@yticksize{0 \pst@number\pst@yticksizeB}% \else\ifx#1b\let\psk@tickstyle\m@ne % -1=b)ottom \edef\psk@xticksize{\pst@number\pst@xticksizeA 0}% \edef\psk@yticksize{\pst@number\pst@yticksizeA 0}% \else\ifx#1i\let\psk@tickstyle\tw@% % 2=i)nner (for frame) \else\@pstrickserr{Bad tick style: `#1#2'}\@ehpa \fi\fi\fi\fi} \psset[pst-plot]{tickstyle=full} % \define@key[psset]{pst-plot}{subticks}[1]{\def\psk@xsubticks{#1}\def\psk@ysubticks{#1}} \define@key[psset]{pst-plot}{xsubticks}[1]{\def\psk@xsubticks{#1}} \define@key[psset]{pst-plot}{ysubticks}[1]{\def\psk@ysubticks{#1}} % \define@key[psset]{pst-plot}{subticksize}[0.75]{\def\psk@xsubticksize{#1}\def\psk@ysubticksize{#1}} \define@key[psset]{pst-plot}{xsubticksize}[0.75]{\def\psk@xsubticksize{#1}} \define@key[psset]{pst-plot}{ysubticksize}[0.75]{\def\psk@ysubticksize{#1}} % \define@key[psset]{pst-plot}{tickwidth}[0.5\pslinewidth]{% \pst@getlength{#1}\psk@xtickwidth% \pst@getlength{#1}\psk@ytickwidth} \define@key[psset]{pst-plot}{xtickwidth}[0.5\pslinewidth]{\pst@getlength{#1}\psk@xtickwidth} \define@key[psset]{pst-plot}{ytickwidth}[0.5\pslinewidth]{\pst@getlength{#1}\psk@ytickwidth} \define@key[psset]{pst-plot}{subtickwidth}[0.25\pslinewidth]{% \pst@getlength{#1}\psk@xsubtickwidth% \pst@getlength{#1}\psk@ysubtickwidth} \define@key[psset]{pst-plot}{xsubtickwidth}[0.25\pslinewidth]{\pst@getlength{#1}\psk@xsubtickwidth} \define@key[psset]{pst-plot}{ysubtickwidth}[0.25\pslinewidth]{\pst@getlength{#1}\psk@ysubtickwidth} % \define@key[psset]{pst-plot}{labelOffset}[0pt]{% \pst@getlength{#1}\psk@xlabelOffset% \pst@getlength{#1}\psk@ylabelOffset} \define@key[psset]{pst-plot}{xlabelOffset}[0pt]{\pst@getlength{#1}\psk@xlabelOffset} \define@key[psset]{pst-plot}{ylabelOffset}[0pt]{\pst@getlength{#1}\psk@ylabelOffset} % \define@key[psset]{pst-plot}{frameOffset}[0pt]{\pst@getlength{#1}\psk@frameOffset} % \define@key[psset]{pst-plot}{tickcolor}[black]{% \pst@getcolor{#1}\psk@xtickcolor% \pst@getcolor{#1}\psk@ytickcolor} \define@key[psset]{pst-plot}{xtickcolor}[black]{\pst@getcolor{#1}\psk@xtickcolor} \define@key[psset]{pst-plot}{ytickcolor}[black]{\pst@getcolor{#1}\psk@ytickcolor} \define@key[psset]{pst-plot}{subtickcolor}[gray]{% \pst@getcolor{#1}\psk@xsubtickcolor% \pst@getcolor{#1}\psk@ysubtickcolor} \define@key[psset]{pst-plot}{xsubtickcolor}[gray]{\pst@getcolor{#1}\psk@xsubtickcolor} \define@key[psset]{pst-plot}{ysubtickcolor}[gray]{\pst@getcolor{#1}\psk@ysubtickcolor} % \define@key[psset]{pst-plot}{xticklinestyle}[solid]{% \@ifundefined{psls@#1}% {\@pstrickserr{Line style `#1' not defined}\@eha}% {\def\psxticklinestyle{#1}}} \define@key[psset]{pst-plot}{xsubticklinestyle}[solid]{% \@ifundefined{psls@#1}% {\@pstrickserr{Line style `#1' not defined}\@eha}% {\def\psxsubticklinestyle{#1}}} \define@key[psset]{pst-plot}{yticklinestyle}[solid]{% \@ifundefined{psls@#1}% {\@pstrickserr{Line style `#1' not defined}\@eha}% {\def\psyticklinestyle{#1}}} \define@key[psset]{pst-plot}{ysubticklinestyle}[solid]{% \@ifundefined{psls@#1}% {\@pstrickserr{Line style `#1' not defined}\@eha}% {\def\psysubticklinestyle{#1}}} \define@key[psset]{pst-plot}{ticklinestyle}[solid]{% \@ifundefined{psls@#1}% {\@pstrickserr{Line style `#1' not defined}\@eha}% {\def\psxticklinestyle{#1}\def\psyticklinestyle{#1}}} \define@key[psset]{pst-plot}{subticklinestyle}[solid]{% \@ifundefined{psls@#1}% {\@pstrickserr{Line style `#1' not defined}\@eha}% {\def\psxsubticklinestyle{#1}\def\psysubticklinestyle{#1}}} % \psset[pst-plot]{subticksize=0.75,subticks=1,tickcolor=black,ticklinestyle=solid, subticklinestyle=solid,subtickcolor=gray,tickwidth=0.5\pslinewidth, subtickwidth=0.25\pslinewidth,labelOffset=0pt,frameOffset=0pt} % \define@key[psset]{pst-plot}{nStep}[1]{\def\psk@nStep{#1}} \define@key[psset]{pst-plot}{nStart}[0]{\def\psk@nStart{#1}} \define@key[psset]{pst-plot}{nEnd}[{}]{\def\psk@nEnd{#1}} \define@key[psset]{pst-plot}{xStep}[0]{\def\psk@xStep{#1}} \define@key[psset]{pst-plot}{yStep}[0]{\def\psk@yStep{#1}} % \define@key[psset]{pst-plot}{xStart}[{}]{\def\psk@xStart{#1}} \define@key[psset]{pst-plot}{xEnd}[{}]{\def\psk@xEnd{#1}} \define@key[psset]{pst-plot}{yStart}[{}]{\def\psk@yStart{#1}} \define@key[psset]{pst-plot}{yEnd}[{}]{\def\psk@yEnd{#1}} % \define@key[psset]{pst-plot}{plotNoX}[1]{\def\psk@plotNoX{#1}} \define@key[psset]{pst-plot}{plotNo}[1]{\def\psk@plotNo{#1}} \define@key[psset]{pst-plot}{plotNoMax}[1]{\def\psk@plotNoMax{#1}} % \define@key[psset]{pst-plot}{plotYMax}[1]{\def\psk@plotYMax{#1}} % \psset[pst-plot]{nStep=1, nStart=0, nEnd={},% xStep=0, yStep=0, xStart={}, xEnd={}, yStart={}, yEnd={}, plotNo=1,plotNoMax=1,plotNoX=1,plotYMax={}}% % \def\pstScalePoints(#1,#2)#3#4{% % xScale | yScale | xOperator | yOperator % the operators can be any Postscript code \def\pstXScale{#1 }% \def\pstYScale{#2 }% \def\pstXPSScale{#3 }% \def\pstYPSScale{#4 }% \pst@def{ScalePoints}<% /yVal ED /xVal ED /yPSOp { #4 yVal mul #2 mul } def /xPSOp { #3 xVal mul #1 mul } def counttomark dup dup cvi eq not { exch pop } if /m exch def /n m 2 div cvi def n { \ifPst@polarplot exch cvi 360 mod PtoC \fi % x cvi 360 mod PtoC yPSOp m 1 roll xPSOp m 1 roll /m m 2 sub def } repeat>% } \pstScalePoints(1,1){}{}% the default -> no special operators % \def\psxs@none{\let\psk@arrowA\@empty\let\psk@arrowB\@empty\psxs@axes} % \def\psxs@axes{{% \ifPst@xAxis\psxs@@axes\pst@dima\pst@dimb\pst@dimc\pst@dimd{}{x}\fi% \ifPst@yAxis\psxs@@axes\pst@dima\pst@dimb\pst@dimc\pst@dimd{exch}{y}\fi% }} % \newif\ifSpecialLabelsDone % \def\psaxes{\pst@object{psaxes}} \def\psaxes@i{% \let\pst@par@save\pst@par \pst@getarrows\psaxes@ii} \def\psaxes@ii(#1){\@ifnextchar({\psaxes@iii(#1)}{\psaxes@iv(0,0)(0,0)(#1)}} \def\psaxes@iii(#1)(#2){\@ifnextchar({\psaxes@iv(#1)(#2)}{\psaxes@iv(#1)(#1)(#2)}} \def\psaxes@iv(#1)(#2)(#3){\@ifnextchar[{\psaxes@v(#1)(#2)(#3)}{\psaxes@vii(#1)(#2)(#3)}}% \def\psaxes@v(#1)(#2)(#3)[#4]{\@ifnextchar[{\psaxes@vi(#1)(#2)(#3)[#4]}{\psaxes@vi(#1)(#2)(#3)[#4][]}}% \def\psaxes@vi(#1)(#2)(#3)[#4,#5][#6,#7]{% \psaxes@vii(#1)(#2)(#3)% \let\pst@par\pst@par@save \begingroup \SpecialCoor \use@par \ifshowgrid\psgrid[style=gridstyleA]\fi \uput{\psxlabelsep}[#5](#3|#1){#4}\uput{\psylabelsep}[#7](#1|#3){#6}% \endgroup \ignorespaces } % \def\psaxes@vii(#1,#2)(#3,#4)(#5,#6){% \pst@killglue \begingroup \ifdim\pst@dimc<\z@\relax \ifdim\pst@dimd<\z@\relax % axes show to left and down \addbefore@par{xlabelPos=t,ylabelPos=r}% \fi\fi \use@par% now the same with an optional unit=... in par \pssetxlength\pst@dimc{#5}% ur-x \pssetylength\pst@dimd{#6}% ur-y \pssetxlength\pst@dimg{#1}% o-x \pssetylength\pst@dimh{#2}% o-y \pssetxlength\pst@dima{#3}% ll-x \pssetylength\pst@dimb{#4}% ll-y % Whole thing will be translated to origin: \pst@dima=\dimexpr\pst@dima-\pst@dimg\relax \pst@dimb=\dimexpr\pst@dimb-\pst@dimh\relax \pst@dimc=\dimexpr\pst@dimc-\pst@dimg\relax \pst@dimd=\dimexpr\pst@dimd-\pst@dimh\relax \setbox\pst@hbox=\hbox\bgroup \ifshowgrid\psgrid[style=gridstyleA]\fi % Make lines/arrows or frame: \@nameuse{psxs@\psk@axesstyle}% \psxs@axes or \psxs@frame or \psxs@polar \ifPst@xAxis \SpecialLabelsDonefalse \begingroup %%% \ifdim\pst@dimb=\z@\else\ifPst@xtrigLabels\else\showoriginfalse\fi\fi \ifnum\psk@dx=\z@ \pst@dimg=\psk@Dx\psxunit \ifdim\pst@dimg<\p@ \pst@cnta=\psk@Dx \edef\psk@Dx{\the\numexpr-1*\pst@cnta}% \fi% v.1.21 \edef\psk@dx{\number\pst@dimg}% \fi \pst@hlabels{\pst@dimc}{\psk@arrowB}{#3}{#5}% Right \ifPst@yAxis\showoriginfalse\fi \pst@hlabels{\pst@dima}{\psk@arrowA}{#3}{#5}% Left \endgroup \fi \ifPst@yAxis \SpecialLabelsDonefalse \begingroup \ifdim\pst@dima=\z@ \else\ifPst@xtrigLabels\showoriginfalse\fi\fi \ifnum\psk@dy=\z@ \pst@dimg=\psk@Dy\psyunit \ifdim\pst@dimg<\p@ \pst@cnta=\psk@Dy \edef\psk@Dy{\the\numexpr-1*\pst@cnta}% \fi% v.1.21 \edef\psk@dy{\number\pst@dimg}% \fi \pst@vlabels{\pst@dimb}{\psk@arrowA}{#4}{#6}% \ifPst@xAxis\ifdim\pst@dima<\z@ \showoriginfalse\fi\fi % no 0 when x- axis is crossing \pst@vlabels{\pst@dimd}{\psk@arrowB}{#4}{#6}% \endgroup \fi % Now close "\pst@hbox" (which is 0-dimensional), and put it at the origin. \egroup% \pssetxlength\pst@dimg{#1}% \pssetylength\pst@dimh{#2}% \leavevmode \psput@cartesian\pst@hbox \endgroup \ignorespaces } % \newif\ifis@yAxis% % \def\psxs@@axes#1#2#3#4#5#6{% llx,lly,urx,ury,exch,x|y,arrowA,arrowB \pst@killglue \begin@SpecialObj \ifx#6x\relax% % x-axis? \is@yAxisfalse \ifnum\psk@dx=\z@ \pst@dimg=\psk@Dx\psxunit \def\psk@dx{\number\pst@dimg}% \fi \else \is@yAxistrue \ifnum\psk@dy=\z@ \pst@dimg=\psk@Dy\psyunit \def\psk@dy{\number\pst@dimg}% \fi \fi \let\pst@linetype\pst@arrowtype \def\pst@axes{axes}% \pst@addarrowdef \addto@pscode{ /showOrigin \ifPst@showOriginTick true \else false \fi def % ticks for 0/0 ? \ifis@yAxis 0 \pst@number#4 \else \pst@number#3 0 \fi \ifis@yAxis 0 \pst@number#2 \else \pst@number#1 0 \fi ArrowA CP 4 2 roll ArrowB 2 copy /yEnd exch def /xEnd exch def \ifx\psk@axesstyle\@none pop pop % axesstyle = none (only ticks) or frame (already drawn) \else gsave % save current state L % the line with arrows \@nameuse{psls@\pslinestyle} % linestyle for the axes stroke % draw the main line grestore \fi /yStart exch def /xStart exch def % \psk@ticks: all=0; x=1; y=2; none=3 \number\psk@ticks\space dup 2 mod 0 eq \ifis@yAxis true \else false \fi and exch 2 lt \ifis@yAxis false \else true \fi and or { /viceversa \ifis@yAxis\pst@number#2 \pst@number#4 \else\pst@number#1 \pst@number#3 \fi gt { true }{ false } ifelse def % other way round /epsilon 0.01 def % rounding errors /minTickline \ifis@yAxis \pst@number#1 \else \pst@number#2 \fi def /maxTickline \ifis@yAxis \pst@number#3 \else \pst@number#4 \fi def /dT \ifis@yAxis \psk@dy \else \psk@dx \fi\space abs % added abs 2006-07-07 65536 div viceversa { neg } if def % div to get pt instead of sp /DT \ifis@yAxis \psk@Dy \else \psk@Dx \fi\space abs viceversa { neg } if def /subTNo \ifis@yAxis\psk@ysubticks\else\psk@xsubticks\fi \space def subTNo 0 gt { /dsubT dT subTNo div def}{ /dsubT 0 def } ifelse % deltaSubTick \ifis@yAxis \psk@yticksize \else \psk@xticksize \fi /tickend exch def /tickstart exch def /Twidth \ifis@yAxis \psk@ytickwidth \else \psk@xtickwidth \fi\space def /subTwidth \ifis@yAxis \psk@ysubtickwidth \else \psk@xsubtickwidth \fi\space def /STsize \ifis@yAxis \psk@ysubticksize \else \psk@xsubticksize \fi\space def /TColor { \ifis@yAxis\pst@usecolor\psk@ytickcolor \else\pst@usecolor\psk@xtickcolor\fi\space } def /subTColor { \ifis@yAxis\pst@usecolor\psk@ysubtickcolor \else\pst@usecolor\psk@xsubtickcolor\fi\space } def /MinValue { \ifis@yAxis yStart \else xStart \fi \ifx\psk@arrowA\@empty\else \psk@arrowsize\space CLW mul add \psk@arrowlength\space mul viceversa { sub epsilon add }{ add epsilon sub } ifelse \fi } def /MaxValue { \ifis@yAxis yEnd \else xEnd \fi \ifx\psk@arrowB\@empty\else \psk@arrowsize\space CLW mul add \psk@arrowlength\space mul viceversa { add epsilon sub }{ sub epsilon add } ifelse \fi } def /logLines { \ifnum\psk@logLines=\z@ true \else % all axes \ifnum\psk@logLines<\tw@ % x axis \ifis@yAxis false \else true \fi % do we have x or y axis \else \ifnum\psk@logLines<\thr@@ % y axis \ifis@yAxis true \else false \fi % do we have x or y axis \else false % no one \fi \fi \fi } def /LSstroke { % set linestyle and stroke \ifis@yAxis \@nameuse{psls@\psyticklinestyle} \else \@nameuse{psls@\psxticklinestyle}\fi stroke} def /subLSstroke { % set sublinestyle and stroke \ifis@yAxis \@nameuse{psls@\psysubticklinestyle} \else \@nameuse{psls@\psxsubticklinestyle}\fi stroke} def %\iffalse % start ticks --------------------------------------------------------- % showOrigin { 0 }{ dT } ifelse 0 dT MaxValue 1 add { % the positive part of the axes, step unit is pt /cntTick exch def % the index logLines { % log lines? gsave 1 1 DT { 1 sub /OffSet exch def % 1 10 subTNo div 9.99 { % do not write a line for 1 % 10 subTNo 1 add div dup 10 { % do not write a line for 1 -10 subTNo 1 add div dup 10 add exch dup -0.1 mul 1 add { % do not write a line for 10 and 1, trace lines between 10 and 1 by steps of 10/subTno /dx exch def % save index % /x cntTick dT dx log mul add def % /x dx log OffSet add \ifis@yAxis\pst@number\psyunit\else\pst@number\psxunit\fi\space mul cntTick add def % x abs MaxValue abs le { % out of range? \ifis@yAxis \ifPst@maxyTicks true \else false \fi \else \ifPst@maxxTicks true \else false \fi \fi { x minTickline #5 moveto x maxTickline #5 lineto } { x tickstart STsize mul #5 moveto x tickend STsize mul #5 lineto } ifelse } if } for } for subTwidth SLW subTColor % set line width and subtick color subLSstroke grestore % restore main tick status stroke /dsubT 0 def % no other subticks } if % end logLines dsubT abs 0 gt { % du we have subticks? gsave % save graphic state % start subticks ---------------------------------------------------------- /cntsubTick cntTick dsubT add def subTNo 1 sub { cntsubTick abs MaxValue abs le { % out of range? \ifis@yAxis \ifPst@maxyTicks true \else false \fi \else \ifPst@maxxTicks true \else false \fi \fi { cntsubTick minTickline STsize mul #5 moveto cntsubTick maxTickline STsize mul #5 lineto } { cntsubTick tickstart STsize mul #5 moveto cntsubTick tickend STsize mul #5 lineto } ifelse }{ exit } ifelse /cntsubTick cntsubTick dsubT add def } repeat subTwidth SLW subTColor % set line width and subtick color subLSstroke % end subticks ---------------------------------------------------------- grestore % restore tick status } if showOrigin { gsave \ifis@yAxis \ifPst@maxyTicks true \else false \fi \else \ifPst@maxxTicks true \else false \fi \fi { cntTick minTickline #5 moveto cntTick maxTickline #5 lineto } { cntTick tickstart #5 moveto % line begin main Tick cntTick tickend #5 lineto } ifelse % lineto tick end Twidth SLW TColor % set line width and tick color LSstroke grestore }{ /showOrigin true def } ifelse % only for the very first tick valid } for % end ticks ---------------------------------------------------------- %\fi %\iffalse % ================================================ % the other side /showOrigin \ifPst@showOriginTick true \else false \fi def % ticks for 0/0 ? /dT dT neg def % the other side of the axis /dsubT dsubT neg def % start ticks ---------------------------------------------------------- % showOrigin { 0 }{ dT } ifelse 0 dT MinValue epsilon viceversa { add }{ sub } ifelse { /cntTick exch def logLines { % log lines? gsave 1 1 DT cvi { 1 sub /OffSet exch def -10 subTNo 1 add div dup 10 add exch dup -0.1 mul 1 add { % do not write a line for 10 and 1, trace lines between 10 and 1 by steps of 10/subTno % 10 subTNo 1 add div dup 10 { % do not write a line for 1 % 1 10 subTNo div 9.99 { % do not write a line for 1 /dx exch def % save index % /x cntTick dT dx log mul add def % /x dx log OffSet add \ifis@yAxis\pst@number\psyunit\else\pst@number\psxunit\fi\space mul cntTick add def x abs MinValue abs le { % out of range? \ifis@yAxis \ifPst@maxyTicks true \else false \fi \else \ifPst@maxxTicks true \else false \fi \fi { x minTickline #5 moveto x maxTickline #5 lineto } { x tickstart STsize mul #5 moveto x tickend STsize mul #5 lineto } ifelse } if } for } for /dsubT 0 def subTwidth SLW subTColor % set line width and subtick color subLSstroke grestore } % end loglines dsubT abs 0 gt { % do we have subticks? gsave % save main state % start subticks ---------------------------------------------------------- /cntsubTick cntTick dsubT add def subTNo 1 sub { cntsubTick abs MinValue abs le { % out of range? cntsubTick tickstart STsize mul #5 moveto cntsubTick tickend STsize mul #5 lineto }{ exit } ifelse /cntsubTick cntsubTick dsubT add def } repeat % for % end subticks ---------------------------------------------------------- subTwidth SLW subTColor % set line width and subtick color subLSstroke grestore % restore main state } if showOrigin { gsave cntTick tickstart #5 moveto % line begin main Tick cntTick tickend #5 lineto % lineto tick end Twidth SLW TColor % set line width and tick color LSstroke grestore }{ /showOrigin true def } ifelse % only for the very first tick valid } for % end ticks ---------------------------------------------------------- %\fi } if }% end of \pscode \end@SpecialObj% % now draw the axes again with the correct linecolor \ifx\psk@axesstyle\@none\else \ifPst@yAxis\psline[linecolor=\pslinecolor](0,#2)(0,#4)\fi \ifPst@xAxis\psline[linecolor=\pslinecolor](#1,0)(#3,0)\fi \fi \ignorespaces }% % \def\psxs@frame{% \psset{axesstyle=none}% \begin@SpecialObj% \addto@pscode{ % the frame \pst@number\pst@dima \psk@frameOffset sub \pst@number\pst@dimb \psk@frameOffset sub moveto % lower left \pst@number\pst@dimc \psk@frameOffset add \pst@number\pst@dimb \psk@frameOffset sub L % upper left \pst@number\pst@dimc \psk@frameOffset add \pst@number\pst@dimd \psk@frameOffset add L % upper right \pst@number\pst@dima \psk@frameOffset sub \pst@number\pst@dimd \psk@frameOffset add L % lower right closepath }% \pst@stroke% \psk@fillstyle% \end@SpecialObj% \let\psk@arrowA\@empty% \let\psk@arrowB\@empty% \pst@xticksizeC=\z@\pst@yticksizeC=\z@ \ifPst@xAxis\psxs@@axes\pst@dima\pst@dimb\pst@dimc\pst@dimd{}{x}\fi% x axis \ifPst@yAxis\psxs@@axes\pst@dima\pst@dimb\pst@dimc\pst@dimd{ exch }{y}\fi% y axis \ifnum\psk@tickstyle=\tw@ % llx,lly,urx,ury,exch,x|y,arrowA,arrowB \psDEBUG[psxs@frame]{psk@tickstyle=2 (inner)}% \psDEBUG[psxs@frame]{pst@dima=\pst@number\pst@dima}% \psDEBUG[psxs@frame]{pst@dimb=\pst@number\pst@dimb}% \psDEBUG[psxs@frame]{pst@dimc=\pst@number\pst@dimc}% \psDEBUG[psxs@frame]{pst@dimd=\pst@number\pst@dimd}% \ifPst@xAxis\psxs@@axes\pst@dima\pst@dimb\pst@dimc\pst@dimd{ neg \pst@number\pst@dimd add }{x}\fi% % upper x axis \ifPst@yAxis\psxs@@axes\pst@dima\pst@dimb\pst@dimc\pst@dimd{ neg \pst@number\pst@dimc add exch }{y}\fi% right y axis \fi% } % %\def\psk@EndAngle{360}% be sure that it isn't undefined %\define@key[psset]{pst-plot}{quadrant}[4]{% % \ifcase#1 \or % \def\psk@EndAngle{90}\or % \def\psk@EndAngle{180}\or % \def\psk@EndAngle{270}\else % \def\psk@EndAngle{360}% % \fi} %\psset[pst-plot]{quadrant=4} \def\psxs@polar{% (rx,ry) % all other values are ignored \pst@killglue \begingroup \edef\pst@dimC{\strip@pt\pst@dimc}% RadiusX \pstFPDiv\pstR@dius{\pst@dimC}{\strip@pt\psxunit}% in cm and as integer \edef\pst@dimD{\strip@pt\pst@dimd}% RadiusX \pstFPDiv\psk@EndAngle{\pst@dimD}{\strip@pt\psyunit}% in cm and as integer \ifnum\psk@EndAngle=0 \def\psk@EndAngle{360}\fi \use@keep@par \pstFPDiv\pstN@lpha{\psk@EndAngle}{\psk@Dy}% No. of (int) main lines \pstFPdiv\pstd@lpha{\psk@Dy}{\psk@ysubticks}% sub dAlpha \pstFPdiv\pstdR@dius{1}{\psk@xsubticks}% sub dRadius \pst@cntm=\psk@xsubticks\advance\pst@cntm by \m@ne \multido{\iA=\psk@Dx+\psk@Dx,\rB=\pstdR@dius+\psk@Dx,\iB=0+1}{\pstR@dius}{% \multido{\rA=\rB+\pstdR@dius}{\the\pst@cntm}{% \psarc[linestyle=\psxsubticklinestyle, linecolor=\psk@xsubtickcolor,linewidth=\psk@xsubtickwidth pt](0,0){\rA}{0}{\psk@EndAngle}} \psarc[linestyle=\psxticklinestyle,linecolor=\psk@xtickcolor, linewidth=\psk@xtickwidth pt](0,0){\iA}{0}{\psk@EndAngle}% \ifnum\psk@labels<2\relax% is all or x (0,1) \uput[-45](\iB,0){\pshlabel{\iB}}\uput[45](0,\iB){\pshlabel{\iB}}% \fi% }% % \uput[-45](\pstR@dius,0){\pstR@dius}\uput[45](0,\pstR@dius){\pstR@dius}% \pst@cntm=\psk@ysubticks\advance\pst@cntm by \m@ne \multido{\iA=\psk@Oy+\psk@Dy,\rB=\pstd@lpha+\psk@Dy}{\pstN@lpha}{% \multido{\rA=\rB+\pstd@lpha}{\the\pst@cntm}{\psline[linestyle=\psysubticklinestyle, linecolor=\psk@ysubtickcolor,linewidth=\psk@ysubtickwidth pt](\pstR@dius;\rA)} \psline[linestyle=\psyticklinestyle, linecolor=\psk@ytickcolor,linewidth=\psk@ytickwidth pt](\pstR@dius;\iA)% \ifodd\psk@labels\else% is all or y (0,3) \uput[\iA](\pstR@dius;\iA){\psvlabel{\iA\psk@ylabelFactor}}% \fi% }% \ifnum\psk@EndAngle<360 \psline[linestyle=\psyticklinestyle, linecolor=\psk@ytickcolor,linewidth=\psk@ytickwidth pt](\pstR@dius;0)\fi \endgroup\ignorespaces% \Pst@xAxisfalse\Pst@yAxisfalse% } % \def\@polar{polar} \define@key[psset]{pst-plot}{axesstyle}[axes]{% \@ifundefined{psxs@#1}% {\@pstrickserr{Axes style `#1' not defined}\@eha}% {\def\psk@axesstyle{#1}% \ifx\psk@axesstyle\@polar\psset{Dy=30}\fi}} \psset[pst-plot]{axesstyle=axes} \define@key[psset]{pst-plot}{xLabels}[]{\def\psk@xLabels{#1}} \define@key[psset]{pst-plot}{xLabelsRot}[0]{\pst@getangle{#1}\pst@xLabelsRot} \psset[pst-plot]{xLabels=,xLabelsRot=0} \define@key[psset]{pst-plot}{yLabels}[]{\def\psk@yLabels{#1}} \define@key[psset]{pst-plot}{yLabelsRot}[0]{\pst@getangle{#1}\pst@yLabelsRot} \psset[pst-plot]{yLabels=,yLabelsRot=0} % % % #1:Max/Min in pt from origin; #2:arrow; #3:min; #4:max \def\pst@hlabels#1#2#3#4{% %\expandafter\typeout\expandafter{#1|#2|#3|#4|}% 0 0 0 10 \ifSpecialLabelsDone \else \kern\psk@xlabelOffset pt % set the x offset? \ifx\empty\psk@xLabels \ifdim#1=\z@ \else % start from 0 ? \ifx#2\empty \else \advance#1\ifdim#1>\z@-\fi7\pslinewidth \fi \pst@cnta=#1\relax % Distance (in sp) to end. \divide\pst@cnta\psk@dx\relax % Number of ticks/labels \ifnum\pst@cnta=\z@ \else \pst@dimb=\psk@dx sp % Space between ticks. % \ifPst@yAxis\else\showorigintrue\fi \ifnum\psk@labels<\tw@ \ifPst@xAxis\pst@@hlabels\fi\fi \showoriginfalse \fi \fi \else \ifnum\psk@xlabelPos=\tw@ \def\pst@tempC{90}\else\def\pst@tempC{-90}\fi \pstFPsub\pst@pmtempa{#4}{#3}% \pstFPDiv\pst@pmtempb{\pst@pmtempa}{\psk@Dx}% \pstFPadd\pst@pmtempc{\pst@pmtempb}{-1}% \pstFPadd\pst@pmtempd{\pst@pmtempb}{1}% \ifdim\pst@pmtempb pt < \z@ \def\pst@pmtempe{\pst@int{\pst@pmtempc}}% \else \def\pst@pmtempe{\pst@int{\pst@pmtempd}}% \fi \multido{\nA=0+1,\rA=#3+\psk@Dx}{\pst@pmtempe}{% \ifdim \nA pt < \z@ \def\nB{-\nA} \else \def\nB{\nA} \fi \uput{\psxlabelsep}[\pst@tempC]{\pst@xLabelsRot}(\rA,0){% \strut\expandafter\pshlabel\expandafter{\psPutXLabel{\nB}}}}% \SpecialLabelsDonetrue \fi \fi } % Knows \pst@dimb and \pst@cnta \def\pst@@hlabels{% \setbox\z@=\vbox{% save all in a box \ifcase\psk@xlabelPos \vskip-\pst@xticksizeA\vskip\psxlabelsep\or% 1 \vskip-1ex\vskip-\pslabelsep\or% 2 \vskip-\pst@xticksizeB\vskip-\psxlabelsep\vskip-1ex% 3 \fi \ifnum\pst@cnta<\z@ \pst@dimb=-\pst@dimb\fi \hbox to \z@{% \ifshoworigin\hbox to \z@{\hss\pst@@@hlabel{\psk@Ox}\hss}\fi \mmultido{\nA=\psk@Ox+\psk@Dx}{\pst@cnta}{% \hskip\pst@dimb \hbox to \z@{\hss \ifdim\nA pt=\z@\relax\ifshoworigin\pst@@@hlabel{0}\fi \else\expandafter\pst@@@hlabel{\nA}% \fi% prevent -0, doesn't work with \ifnum \hss}% }\hss% 1.85 }% }\ht\z@\z@ \dp\z@\z@ \box\z@}% set all values to zero % % #1:Max/Min in pt from origin; #2:arrow; #3:min; #4:max % \psk@labels 0:all; 1:x; 2:y; 3:none \def\pst@vlabels#1#2#3#4{% \ifSpecialLabelsDone\else \ifx\empty\psk@yLabels \ifdim#1=\z@\else \ifx#2\empty\else\ifdim#1>\z@ \advance#1 by -7\pslinewidth\else\advance#1 by 7\pslinewidth\fi\fi \pst@cnta=#1\relax % % Distance (in sp) to end. \divide\pst@cnta\psk@dy\relax% % Number of ticks/labels \ifnum\pst@cnta=\z@\else \pst@dima=\psk@dy sp% % Space between ticks. \ifodd\number\psk@labels\else\ifPst@yAxis\pst@@vlabels\fi \fi \showoriginfalse \fi \fi \else \pstFPsub\pst@pmtempa{#4}{#3}% \pstFPDiv\pst@pmtempb{\pst@pmtempa}{\psk@Dy}% \pstFPadd\pst@pmtempc{\pst@pmtempb}{-1}% \pstFPadd\pst@pmtempd{\pst@pmtempb}{1}% \ifdim\pst@pmtempb pt < \z@ \def\pst@pmtempe{\pst@int{\pst@pmtempc}}\else\def\pst@pmtempe{\pst@int{\pst@pmtempd}}\fi \multido{\nA=0+1,\rA=#3+\psk@Dy}{\pst@pmtempe}{% \ifdim \nA pt < \z@ \def\nB{-\nA}\else \def\nB{\nA}\fi \ifnum\psk@ylabelPos=0 \uput{\psylabelsep}[180]{\pst@yLabelsRot}(0,\rA){% \strut\expandafter\psvlabel\expandafter{\psPutYLabel{\nB}}}% \else \uput{\psylabelsep}[0]{\pst@yLabelsRot}(0,\rA){% \strut\expandafter\psvlabel\expandafter{\psPutYLabel{\nB}}}% \fi }% \SpecialLabelsDonetrue \fi \fi } % \pst@dima: the width between two labels in pt % \pst@dimc: the coordinate of the origin in pt % \pst@cnta: the lowest label % \pst@ticksizeC the lowest or highest value \def\pst@@vlabels{% % \psDEBUG[pst@@vlabels]{yticksizeC=\the\pst@yticksizeC}% for left labels we use \def\llap#1{\hb@xt@\z@{\hss#1}} \vbox to\z@{% \vbox to -\psk@ylabelOffset pt{}% the y label offset \ifnum\pst@cnta>\z@ \pst@dima=-\pst@dima\fi% up or down label positions \offinterlineskip \ifshoworigin \vbox to \z@{\vss\hbox to\z@{% \ifcase\psk@ylabelPos \hss\pst@@@vlabel{\psk@Oy}\hskip\psylabelsep\hskip-\pst@yticksizeA\or% \hskip\pslabelsep\hss\pst@@@vlabel{\psk@Oy}\hss\or% % right labels \hskip\pst@yticksizeB\hskip\psylabelsep\pst@@@vlabel{\psk@Oy}% \fi}\vss}% \fi \mmultido{\nA=\psk@Oy+\psk@Dy}{\pst@cnta}{% \vbox to\pst@dima{\vss}% \vbox to \z@{% \vss\hbox to\z@{% \ifcase\psk@ylabelPos % and also check for -0 \hss\ifdim\nA pt=\z@ \ifshoworigin\pst@@@vlabel{0}\fi\else\pst@@@vlabel{\nA}\fi \hskip\psylabelsep\hskip-\pst@yticksizeA\or% top = 1 \hss\ifdim\nA pt=\z@ \ifshoworigin\pst@@@vlabel{0}\fi\else\pst@@@vlabel{\nA}\fi \ifdim\psylabelsep=\z@\hss\else\kern-\psylabelsep\fi\or% right=2 \hskip\pst@yticksizeB\hskip\psylabelsep \ifdim\nA pt=\z@ \ifshoworigin\pst@@@vlabel{0}\fi\else\pst@@@vlabel{\nA}\fi% bottom \fi}\vss}% }\vss}% } % \define@key[psset]{pst-plot}{xAxisLabel}[x]{\def\psk@xAxisLabel{#1}} \define@key[psset]{pst-plot}{yAxisLabel}[y]{\def\psk@yAxisLabel{#1}} \psset[pst-plot]{xAxisLabel=x,yAxisLabel=y} \define@key[psset]{pst-plot}{xAxisLabelPos}[{}]{\def\psk@xAxisLabelPos{#1}} \define@key[psset]{pst-plot}{yAxisLabelPos}[{}]{\def\psk@yAxisLabelPos{#1}} \psset[pst-plot]{yAxisLabelPos={},xAxisLabelPos={}} % \newdimen\psk@llx \newdimen\psk@lly \newdimen\psk@urx \newdimen\psk@ury \define@key[psset]{pst-plot}{llx}[\z@]{\pssetxlength\psk@llx{#1}} \define@key[psset]{pst-plot}{lly}[\z@]{\pssetylength\psk@lly{#1}} \define@key[psset]{pst-plot}{urx}[\z@]{\pssetxlength\psk@urx{#1}} \define@key[psset]{pst-plot}{ury}[\z@]{\pssetylength\psk@ury{#1}} \psset[pst-plot]{llx=\z@, lly=\z@, urx=\z@, ury=\z@}% prevents rounding errors % \define@boolkey[psset]{pst-plot}[Pst@]{psgrid}[true]{} \define@key[psset]{pst-plot}{gridpara}[{}]{\def\psk@gridpara{#1}} \define@key[psset]{pst-plot}{gridcoor}[\relax]{\def\psk@gridcoor{#1}} \psset[pst-plot]{psgrid=false,gridpara={gridlabels=0pt,gridcolor=red!30,subgridcolor=green!30,subgridwidth=0.5\pslinewidth, subgriddiv=5},gridcoor=\relax} % \define@key[psset]{pst-plot}{axespos}[bottom]{\pst@expandafter\psset@@axespos{#1}\@nil} \def\psset@@axespos#1#2\@nil{% \ifx#1b\let\psk@axespos\z@\else % 0=b)bottom \ifx#1t\let\psk@axespos\@ne % 1=t)op \else\@pstrickserr{Bad axes position: `#1#2'}\@ehpa \fi\fi} \psset[pst-plot]{axespos=b} % \newdimen\pst@xunit \newdimen\pst@yunit % \def\pslegend{\@ifnextchar[\pslegend@i{\pslegend@i[rt]}} \def\pslegend@i[#1]{\@ifnextchar({\pslegend@ii[#1]}{\pslegend@ii[#1](\pst@number\pslabelsep,\pst@number\pslabelsep)}} \def\pslegend@ii[#1](#2,#3)#4{% \gdef\pslegend@ref{#1}% \xdef\pslegend@sepx{#2 }% \xdef\pslegend@sepy{#3 }% \gdef\pslegend@text{#4}} % \newpsstyle{legendstyle}{fillstyle=solid,fillcolor=white,linewidth=0.5pt} % \def\pslegend@iii[#1](#2){\rput[#1](#2){\psframebox[style=legendstyle]{% \footnotesize\tabcolsep=2pt% \tabular[t]{@{}ll@{}}\pslegend@text\endtabular}}\global\let\pslegend@text\relax} \let\pslegend@text\relax% define it as empty % \def\psgraph{\pst@object{psgraph}} \def\psgraph@i{% \let\psgraph@para\pst@par \let\psk@save@arrowA\psk@arrowA \let\psk@save@arrowB\psk@arrowB \pst@getarrows\psgraph@ii} \def\psgraph@ii(#1,#2){\catcode`\!=12\relax \@ifnextchar({\psgraph@iii(#1,#2)}{\psgraph@iv(0,0)(#1,#2)}} \def\psgraph@iii(#1,#2)(#3,#4){\@ifnextchar({\psgraph@v(#1,#2)(#3,#4)}{\psgraph@iv(#1,#2)(#3,#4)}} % \def\psgraph@iv(#1,#2)(#3,#4)#5#6{% no special origin defined % minX | minY | maxX | maxY | Length x-axis | length y-axis% \pst@killglue% % \let\psgraph@para\pst@par \begingroup % \bgroup \use@keep@par % \egroup% \pstFPsub\pst@tempA{#3}{#1}% \pst@dimm=#5 \pst@dimo=\pst@tempA pt \pstFPdiv\pst@@dx{\strip@pt\pst@dimm}{\pst@tempA}% \pst@xunit=\pst@@dx\p@ % \ifx!#6\let\pst@yunit=\pst@xunit\else \pst@dimm=#6 % \pst@dimm=\pst@@dx\pst@dimo\else\pst@dimm=#6\fi% \pstFPsub\pst@tempA{#4}{#2}% \pstFPdiv\pst@@dy{\strip@pt\pst@dimm}{\pst@tempA}% \pst@yunit=\pst@@dy\p@ \fi % \pst@dimm=#1\pst@xunit\advance\pst@dimm by \psk@llx \pst@dimn=#2\pst@yunit\advance\pst@dimn by \psk@lly \pst@dimo=#3\pst@xunit\advance\pst@dimo by \psk@urx \pst@dimp=#4\pst@yunit\advance\pst@dimp by \psk@ury \if@star\pspicture*(\pst@dimm,\pst@dimn)(\pst@dimo,\pst@dimp)\else \pspicture(\pst@dimm,\pst@dimn)(\pst@dimo,\pst@dimp)\fi \let\psxunit\pst@xunit \let\psyunit\pst@yunit \ifdim\pst@xunit=\pst@yunit\relax\psset{runit=\pst@xunit}\fi% \bgroup \use@par \ifPst@psgrid \expandafter\psset\expandafter{\psk@gridpara}% \rput[lb](0,0){\expandafter\psgrid\psk@gridcoor} \fi \ifnum\psk@axespos=0 \expandafter\psaxes\expandafter[\psgraph@para](#1,#2)(#3,#4)% \else \xdef\psgraph@coor{(#1,#2)(#3,#4)(#5,#6)}% \fi \egroup \psgraph@vi(#1,#2)(#1,#2)(#3,#4)% } \def\psgraph@v(#1,#2)(#3,#4)(#5,#6)#7#8{% with special origin % Xorig | yorig | minX | minY | maxX | maxY | Length x-axis | length y-axis% \pst@killglue% \let\psgraph@para\pst@par \begingroup% % \bgroup% \use@keep@par % \egroup% \pstFPsub\pst@tempA{#5}{#3}% \pst@dimm=#7% \pst@dimo=\pst@tempA pt% \pstFPdiv\pst@@dx{\strip@pt\pst@dimm}\pst@tempA% \pst@xunit=\pst@@dx\p@% % \ifx!#8\let\pst@yunit=\pst@xunit\else \pst@dimm=#8% \pstFPsub\pst@tempA{#6}{#4}% \pstFPdiv\pst@@dy{\strip@pt\pst@dimm}\pst@tempA% \pst@yunit=\pst@@dy\p@% \fi% % \pst@dima=#3\pst@xunit \advance\pst@dima by \psk@llx% \pst@dimb=#4\pst@yunit \advance\pst@dimb by \psk@lly% \pst@dimc=#5\pst@xunit \advance\pst@dimc by \psk@urx% \pst@dimd=#6\pst@yunit \advance\pst@dimd by \psk@ury% \if@star\pspicture*(\pst@dima,\pst@dimb)(\pst@dimc,\pst@dimd)\else% \pspicture(\pst@dima,\pst@dimb)(\pst@dimc,\pst@dimd)\fi% \psset{xunit=\pst@xunit,yunit=\pst@yunit} \ifdim\pst@xunit=\pst@yunit \psset{runit=\pst@xunit}\fi% \bgroup% \use@par% \ifPst@psgrid \expandafter\psset\expandafter{\psk@gridpara}% \rput[lb](0,0){\expandafter\psgrid\psk@gridcoor} \fi% \ifnum\psk@axespos=0 \psaxes(#1,#2)(#3,#4)(#5,#6)% \else \xdef\psgraph@coor{(#1,#2)(#3,#4)(#5,#6)}% \fi \egroup \psgraph@vi(#1,#2)(#3,#4)(#5,#6)% } % \def\setxLabelC@@r#1,#2(#3,#4)(#5){% \pst@getcoor{#5}\pst@tempB% \ifx c#1 \pssetylength\pst@dimm{#2}% \rput(! #4 #3 add 2 div \pst@number\pst@dimm \pst@tempB\space exch pop add \pst@number\psyunit div ){\psk@xAxisLabel}% \else% \pst@getcoor{\psk@xAxisLabelPos}\pst@tempA% \rput(! \pst@tempA\space \pst@tempB\space exch pop add \tx@UserCoor ){\psk@xAxisLabel}% \fi} \def\setyLabelC@@r#1,#2(#3,#4)(#5){% \pst@getcoor{#5}\pst@tempB% \ifx c#2 \pssetxlength\pst@dimm{#1}% \rput{90}(! \pst@number\pst@dimm \pst@tempB\space pop add \pst@number\psxunit div #4 #3 add 2 div ){\psk@yAxisLabel}% \else% \pst@getcoor{\psk@yAxisLabelPos}\pst@tempA% \rput{90}(! \pst@tempB\space pop \pst@tempA\space 3 1 roll add exch \tx@UserCoor ){\psk@yAxisLabel}% \fi} % \def\psgraph@vi(#1,#2)(#3,#4)(#5,#6){% \ifx\psk@xAxisLabel\@empty\else% \ifx\psk@xAxisLabelPos\@empty\uput[0](#5,#2){\psk@xAxisLabel}% \else\expandafter\setxLabelC@@r\psk@xAxisLabelPos(#3,#5)(#1,#2)\fi% \fi% \ifx\psk@yAxisLabel\@empty\else% \ifx\psk@yAxisLabelPos\@empty\uput[90](#1,#6){\psk@yAxisLabel}% \else\expandafter\setyLabelC@@r\psk@yAxisLabelPos(#4,#6)(#1,#2)\fi% \fi% \def\lt@@{lt}\def\lb@@{lb}\def\rb@@{rb}% \ifx\pslegend@ref\lb@@ \gdef\pslegend@coor{#3 \pslegend@sepx \pst@number\psxunit div add \pslegend@sepy \pst@number\psyunit div}% \else% \ifx\pslegend@ref\lt@@ \gdef\pslegend@coor{#3 \pslegend@sepx \pst@number\psxunit div add #6 \pslegend@sepy \pst@number\psyunit div sub}% \else% \ifx\pslegend@ref\rb@@\gdef\pslegend@coor{#5 \pslegend@sepx \pst@number\psxunit div sub \pslegend@sepy \pst@number\psyunit div}% \else \gdef\pslegend@coor{#5 \pslegend@sepx \pst@number\psxunit div sub #6 \pslegend@sepy \pst@number\psyunit div sub}% \fi% \fi% \fi% \xdef\psgraphLLx{#3}\xdef\psgraphLLy{#4}\xdef\psgraphURx{#5}\xdef\psgraphURy{#6}% \global\let\psk@arrowA\psk@save@arrowA \global\let\psk@arrowB\psk@save@arrowB \ignorespaces } % \def\endpsgraph{% % \pst@killglue% \ifx\relax\pslegend@text\relax \else\pslegend@iii[\pslegend@ref](!\pslegend@coor)\fi \expandafter\psset\expandafter{\psgraph@para}% \ifnum\psk@axespos>0 \expandafter\psaxes\psgraph@coor \fi \endpspicture \endgroup\ignorespaces} % \@namedef{psgraph*}{\psgraph*} \@namedef{endpsgraph*}{\endpsgraph} % \def\psPutXLabel#1{% \global\pst@cnto=0\relax \global\pst@cntp=#1\relax \expandafter\get@Label\psk@xLabels,,\@nil% } \def\psPutYLabel#1{% \global\pst@cnto=0\relax \global\pst@cntp=#1\relax \expandafter\get@Label\psk@yLabels,,\@nil% } \def\get@Label#1,#2,#3\@nil{% \ifnum\the\pst@cnto<\the\pst@cntp \global\advance\pst@cnto by \@ne \ifx\relax#3\relax\else\expandafter\get@Label#2,#3\@nil\fi% \else #1\fi% } % \def\psVectorfield{\pst@object{psVectorfield}} \def\psVectorfield@i(#1,#2)(#3,#4)#5{{% \addbefore@par{Dx=0.1,Dy=0.1,Ox=3,arrows=->,linewidth=0.2pt}% \begin@SpecialObj \SpecialCoor \pstFPsub\pst@tempA{#3}{#1}% \pstFPsub\pst@tempB{#4}{#2}% \pstFPDiv{\pst@tempC}{\pst@tempA}{\psk@Dx}% \pstFPDiv{\pst@tempD}{\pst@tempB}{\psk@Dy}% \pstVerb{ /yStrich \ifPst@algebraic (#5) tx@AlgToPs begin AlgToPs end cvx \else { #5 } \fi def }% \multido{\rX=#1+\psk@Dx}{\numexpr\pst@tempC+1}{% \multido{\rY=#2+\psk@Dy}{\numexpr\pst@tempD+1}{% \psline% (! /x \rX\space def % /ocount 0 def %%%%%%%%%%%%%%%%%%%% WARUM???? %%%%%%%% /y \rY\space def /yTemp yStrich \psk@Dx\space \psk@Ox\space div mul def \rX\space \psk@Dx\space \psk@Ox\space div sub \rY\space yTemp sub)% (! /x \rX\space def % /ocount 0 def %%%%%%%%%%%%%%%%%%%% WARUM???? %%%%%%%% /y \rY\space def /yTemp yStrich \psk@Dx\space \psk@Ox\space div mul def \rX\space \psk@Dx\space \psk@Ox\space div add \rY\space yTemp add)% }}% \end@SpecialObj }\ignorespaces} % \def\psFixpoint{\pst@object{psFixpoint}} \def\psFixpoint@i#1#2#3{% #1: xStart #2: f(x) #3: number of iterations \pst@killglue% \begingroup% \use@par% \@nameuse{beginplot@\psplotstyle}% \addto@pscode{ \psplot@init /x #1 def /F@pstplot \ifPst@algebraic (#2) tx@AlgToPs begin AlgToPs end cvx \else { #2 } \fi def /xy { x \pst@number\psxunit mul F@pstplot dup /x ED \pst@number\psyunit mul } def }% \gdef\psplot@init{}% \@pstfalse% \@nameuse{testqp@\psplotstyle}% \addto@pscode{ mark x \pst@number\psxunit mul 0 /n 2 def #3 { xy dup dup /n n 4 add def } repeat }% \@nameuse{endplot@\psplotstyle}% \endgroup% \ignorespaces} % \define@boolkey[psset]{pst-plot}[Pst@]{showDerivation}[true]{} \psset{showDerivation} % \def\psNewton{\pst@object{psNewton}} \def\psNewton@i#1#2{\@ifnextchar[{\psNewton@ii{#1}{#2}}{\psNewton@iii{#1}{#2}}} \def\psNewton@ii#1#2[#3]#4{% #1:xStart #2:f(x) #3:f'(x) #4:number of iterations \pst@killglue% \begingroup% \addbefore@par{showDerivation}% \use@par% \@nameuse{beginplot@\psplotstyle}% \addto@pscode{ \psplot@init /x #1 def /F@pstplot \ifPst@algebraic (#2) tx@AlgToPs begin AlgToPs end cvx \else { #2 } \fi def /F@pstplotDerive \ifPst@algebraic (#3) tx@AlgToPs begin AlgToPs end cvx \else { #3 } \fi def /newxVal { % y on stack F@pstplotDerive % we have m div neg %\pst@number\psxunit div % new x val = -y0/m } def }% \gdef\psplot@init{}% \@pstfalse% \@nameuse{testqp@\psplotstyle}% \addto@pscode{ mark x 0 \tx@ScreenCoor % start point /n 2 def #4 { F@pstplot /yVal ED x yVal \tx@ScreenCoor /n n 2 add def yVal newxVal x add /x ED x 0 \tx@ScreenCoor \ifPst@showDerivation /n n 4 add def \else moveto /n n 2 add def\fi } repeat pstack }% \@nameuse{endplot@\psplotstyle}% \endgroup% \ignorespaces} \def\psNewton@iii#1#2#3{% #1:xStart #2:f(x) #3:number of iterations \pst@killglue% \begingroup% \addbefore@par{VarStepEpsilon=0.01,showDerivation}% \use@par% \@nameuse{beginplot@\psplotstyle}% \addto@pscode{ \psplot@init /epsilon \psk@VarStepEpsilon\space def /x #1 def /F@pstplot \ifPst@algebraic (#2) tx@AlgToPs begin AlgToPs end cvx \else { #2 } \fi def /newxVal { % y on stack /saveX x def saveX epsilon add /x ED F@pstplot saveX epsilon sub /x ED F@pstplot sub epsilon dup add div % we have m div neg % new x val = -y0/m /x saveX def } def }% \gdef\psplot@init{}% \@pstfalse% \@nameuse{testqp@\psplotstyle}% \addto@pscode{ mark x 0 \tx@ScreenCoor % start point /n 2 def #3 { F@pstplot /yVal ED x yVal \tx@ScreenCoor yVal newxVal x add /x ED x 0 \tx@ScreenCoor \ifPst@showDerivation /n n 4 add def \else moveto /n n 2 add def\fi } repeat }% \@nameuse{endplot@\psplotstyle}% \endgroup% \ignorespaces} % \def\psResetPlotValues{% \psset{method={}}% }% \catcode`\@=\TheAtCode\relax \endinput %% %% END pst-plot.tex