%% BEGIN pst-plot.tex %% %% Plots and axes with PSTricks 97. %% See the PSTricks User's Guide for documentation. %% \def\fileversion{97 patch 1} \def\filedate{1997/04/28} %% %% COPYRIGHT 1993, 1994, 1999 by Timothy Van Zandt, tvz@nwu.edu. %% %% 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. %% \message{ v\fileversion, \filedate} \csname PSTplotLoaded\endcsname \let\PSTplotLoaded\endinput \ifx\PSTricksLoaded\endinput\else \def\next{\input pstricks.tex } \expandafter\next \fi \ifx\MultidoLoaded\endinput\else \def\next{\input multido.tex } \expandafter\next \fi \edef\TheAtCode{\the\catcode`\@} \catcode`\@=11 % 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 \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 \expandafter\readdata@@\pst@tempa_\@nil \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#1#2{% \openin1=#2 \begingroup \def\pst@tempg{}% \ifeof1 \@pstrickserr{Data file `#2' not found.}\@ehpa \else \pst@datadelimiters \catcode`\[=1 \catcode`\]=2 \readdata@% \fi \endgroup \let#1\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}} \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} \def\beginplot@bezier{\begin@OpenObj} \def\endplot@bezier{\psbezier@ii} \def\beginplot@cbezier{\begin@ClosedObj} \def\endplot@cbezier{\pscbezier@ii} \def\psset@plotstyle#1{% \@ifundefined{beginplot@#1}% {\@pstrickserr{Plot style `#1' not defined}\@eha}% {\edef\psplotstyle{#1}}} \psset@plotstyle{line} \def\psset@plotpoints#1{% \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@plotpoints{50} % 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{L } \def\endqp@line{\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{L } \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 - 1996/1997 % Dot } %\def\doqp@dots{Dot } /TheDot { gsave \psk@dotangle \psk@dotscale Dot grestore } def TheDot } % DG/SR modification end \def\doqp@dots{TheDot } \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 { curveto } 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} \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% \addto@pscode{D}% \@nameuse{endqp@\psplotstyle}} \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} \pst@def{ScalePoints}<% /y ED /x ED counttomark dup dup cvi eq not { exch pop } if /m exch def /n m 2 div cvi def n { y mul m 1 roll x mul m 1 roll /m m 2 sub def } repeat> \def\listplot{\def\pst@par{}\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{\pst@number\psxunit \pst@number\psyunit \tx@ScalePoints}% \@nameuse{endplot@\psplotstyle}} % \psplot \def\psplotinit#1{\xdef\psplot@init{#1 }} \def\psplot@init{} \def\psplot{\def\pst@par{}\pst@object{psplot}} \def\psplot@i#1#2#3{% \pst@killglue \begingroup \use@par \@nameuse{beginplot@\psplotstyle}% \addto@pscode{% \psplot@init /x #1 def /x1 #2 def /dx x1 x sub \psk@plotpoints div def /xy { x \pst@number\psxunit mul #3 \pst@number\psyunit mul } def}% \gdef\psplot@init{}% \@pstfalse \@nameuse{testqp@\psplotstyle}% \if@pst \psplot@ii \else \psplot@iii \fi \endgroup \ignorespaces} \def\psplot@ii{% \addto@pscode{% xy \@nameuse{beginqp@\psplotstyle} \psk@plotpoints 1 sub { /x x dx add def xy \@nameuse{doqp@\psplotstyle} } repeat /x x1 def xy \@nameuse{doqp@\psplotstyle}}% \@nameuse{endqp@\psplotstyle}} \def\psplot@iii{% \addto@pscode{% mark /n 2 def \psk@plotpoints { xy n 2 roll /n n 2 add def /x x dx add def } repeat /x x1 def xy n 2 roll}% \@nameuse{endplot@\psplotstyle}} \def\parametricplot{\def\pst@par{}\pst@object{parametricplot}} \def\parametricplot@i#1#2#3{% \pst@killglue \begingroup \use@par \@nameuse{beginplot@\psplotstyle}% \addto@pscode{% \psplot@init /t #1 def /t1 #2 def /dt t1 t sub \psk@plotpoints div def /xy { #3 \pst@number\psyunit mul exch \pst@number\psxunit mul exch } def}% \gdef\psplot@init{}% \@pstfalse \@nameuse{testqp@\psplotstyle}% \if@pst \parametricplot@ii \else \parametricplot@iii \fi \endgroup \ignorespaces} \def\parametricplot@ii{% \addto@pscode{% xy \@nameuse{beginqp@\psplotstyle} \psk@plotpoints 1 sub { /t t dt add def xy \@nameuse{doqp@\psplotstyle} } repeat /t t1 def xy \@nameuse{doqp@\psplotstyle}}% \@nameuse{endqp@\psplotstyle}} \def\parametricplot@iii{% \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}% \@nameuse{endplot@\psplotstyle}} % These axes macros are complicated. Be careful. % \pst@ticks{angle}{dx}{n}{int} % int=1 if ticks appear on top of axes, 0 otherwise. \def\pst@ticks#1#2#3#4{% \begin@SpecialObj \addto@pscode{% #1 rotate /n #3 def /dx #2 def n 0 lt { /dx dx neg def /n n neg def } if /y2 \psk@ticksize CLW 2 div add def /y1 y2 neg def \ifnum\psk@tickstyle=1 \ifdim#4<\z@ /y2 \else /y1 \fi 0 def \else \ifnum\psk@tickstyle=-1 \ifdim#4<\z@ /y1 \else /y2 \fi 0 def \fi \fi /x dx def n { x y1 moveto x y2 lineto stroke /x x dx add def } repeat}% \end@SpecialObj} \def\psset@ticksize#1{\pst@getlength{#1}\psk@ticksize} \psset@ticksize{3pt} \def\psset@tickstyle#1{\pst@expandafter\psset@@tickstyle{#1}\@nil} \def\psset@@tickstyle#1#2\@nil{% \ifx#1f\let\psk@tickstyle\z@\else \ifx#1t\let\psk@tickstyle\@ne\else \ifx#1b\let\psk@tickstyle\m@ne\else \@pstrickserr{Bad tick style: `#1#2'}\@ehpa \fi\fi\fi} \psset@tickstyle{full} \def\psset@ticks#1{\pst@expandafter\psset@@ticks{#1}\@nil\psk@ticks} \def\psset@@ticks#1#2\@nil#3{% \ifx#1a\let#3\z@\else \ifx#1x\let#3\@ne\else \ifx#1y\let#3\tw@\else \ifx#1n\let#3\thr@@\else \@pstrickserr{Bad argument: `#1#2'}\@ehpa \fi\fi\fi\fi} \psset@ticks{all} \def\psset@labels#1{\pst@expandafter\psset@@ticks{#1}\@nil\psk@labels} \psset@labels{all} \def\psset@Ox#1{\edef\psk@Ox{#1}} \psset@Ox{0} \def\psset@Dx#1{\edef\psk@Dx{#1}} \psset@Dx{1} \def\psset@dx#1{% \pssetxlength\pst@dimg{#1}% \edef\psk@dx{\number\pst@dimg}} \psset@dx{0} \def\psset@Oy#1{\edef\psk@Oy{#1}} \psset@Oy{0} \def\psset@Dy#1{\edef\psk@Dy{#1}} \psset@Dy{1} \def\psset@dy#1{% \pssetylength\pst@dimg{#1}% \edef\psk@dy{\number\pst@dimg}} \psset@dy{0} \newif\ifshoworigin \def\psset@showorigin#1{\@nameuse{showorigin#1}} \psset@showorigin{true} \def\psaxes{\def\pst@par{}\pst@object{psaxes}} \def\psaxes@i{\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,#4)(#5,#6){% \setbox\pst@hbox=\hbox\bgroup \use@par \pssetxlength\pst@dimg{#1}% o-x \pssetylength\pst@dimh{#2}% o-y \pssetxlength\pst@dima{#3}% bl-x \pssetylength\pst@dimb{#4}% bl-y \pssetxlength\pst@dimc{#5}% ur-x \pssetylength\pst@dimd{#6}% ur-y % Whole thing will be translated to origin: \advance\pst@dima-\pst@dimg % Dist. from bl-x to o-x \advance\pst@dimb-\pst@dimh % Dist. from bl-y to o-y \advance\pst@dimc-\pst@dimg % Dist. from ur-x to o-x \advance\pst@dimd-\pst@dimh % Dist. from ur-y to o-y % Make lines/arrows or frame: \@nameuse{psxs@\psk@axesstyle}% % "\pslabelsep" should be from the edge of the axis. \advance\pslabelsep.5\pslinewidth % Now the ticks and labels. Start by checking for "\multido". % !!Need to fix this so that does nothing when there are 0 ticks.!! \begingroup \ifdim\pst@dimb=\z@\else\showoriginfalse\fi \ifnum\psk@dx=\z@ \pst@dimg=\psk@Dx\psxunit \edef\psk@dx{\number\pst@dimg}% \fi \ifnum\psk@ticks<\tw@ \ifnum\psk@tickstyle>\z@\else \advance\pslabelsep\psk@ticksize\p@ \fi \fi \pst@hlabels\pst@dimc\psk@arrowB \pst@hlabels\pst@dima\psk@arrowA \endgroup \begingroup \ifdim\pst@dima=\z@\else\showoriginfalse\fi \ifnum\psk@dy=\z@ \pst@dimg=\psk@Dy\psyunit \edef\psk@dy{\number\pst@dimg}% \fi \ifodd\psk@ticks\else \ifnum\psk@tickstyle>\z@\else \advance\pslabelsep\psk@ticksize\p@ \fi \fi \pst@vlabels\pst@dimd\psk@arrowB \pst@vlabels\pst@dimb\psk@arrowA \endgroup % 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 \ignorespaces} \def\psxs@axes{% \psxs@@axes\pst@dima\pst@dimc{}% \psxs@@axes\pst@dimb\pst@dimd{exch}} \def\psxs@@axes#1#2#3{% \begin@SpecialObj \ifdim#1=\z@ \def\psk@arrowA{C}% \else \ifdim#2=\z@ \def\psk@arrowB{C}% \fi \fi \let\pst@linetype\pst@arrowtype \pst@addarrowdef \addto@pscode{% \pst@number#2 0 #3 \pst@number#1 0 #3 ArrowA CP 4 2 roll ArrowB L pop pop}% \pst@stroke \end@SpecialObj} \def\psxs@frame{% \begin@SpecialObj \addto@pscode{% 0 0 moveto \pst@number\pst@dimc 0 L 0 \pst@number\pst@dimd 2 copy rlineto L closepath}% \pst@stroke \psk@fillstyle \end@SpecialObj \let\psk@arrowA\@empty \let\psk@arrowB\@empty} \def\psset@axesstyle#1{% \@ifundefined{psxs@#1}% {\@pstrickserr{Axes style `#1' not defined}\@eha}% {\edef\psk@axesstyle{#1}}} \psset@axesstyle{axes} \def\psxs@none{\let\psk@arrowA\@empty\let\psk@arrowB\@empty} % The origin is never the only label. \def\pst@hlabels#1#2{% \ifdim#1=\z@\else \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. \ifnum\psk@ticks<\tw@ \pst@ticks{0}{\pst@number\pst@dimb}{\the\pst@cnta}{\pst@dimd}% \fi \ifnum\psk@labels<\tw@ \pst@@hlabels\fi \showoriginfalse \fi \fi} % Knows \pst@dimb and \pst@cnta \def\pst@@hlabels{% \vbox to\z@{% \ifdim\pst@dimd>\z@\vskip\pslabelsep\else\vss\fi \ifnum\pst@cnta<\z@ \pst@dimb=-\pst@dimb \fi \hbox to\z@{% \ifshoworigin\hbox to \z@{\hss\pshlabel{\psk@Ox}\hss}\fi \mmultido {\n=\psk@Ox+\psk@Dx}% {\pst@cnta}% {\hskip\pst@dimb\hbox to \z@{\hss\pshlabel{\n}\hss}}% \hss}% \ifdim\pst@dimd>\z@\vss\else\vskip\pslabelsep\fi}}% \def\pshlabel#1{$#1$} \def\pst@vlabels#1#2{% \ifdim#1=\z@\else \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@dy\relax % Number of ticks/labels \ifnum\pst@cnta=\z@\else \pst@dima=\psk@dy sp % Space between ticks. \ifodd\psk@ticks\else \pst@ticks{90}{\pst@number\pst@dima}{\the\pst@cnta}{-\pst@dimc}% \fi \ifodd\psk@labels\else\pst@@vlabels\fi \showoriginfalse \fi \fi} % Knows \pst@dima and \pst@cnta \def\pst@@vlabels{% \vbox to\z@{% \ifnum\pst@cnta>\z@ \pst@dima=-\pst@dima \fi \offinterlineskip \ifshoworigin \vbox to \z@{\vss\hbox to\z@{% \ifdim\pst@dimc>\z@\hss\else\hskip\pslabelsep\fi \psvlabel{\psk@Oy}% \ifdim\pst@dimc>\z@\hskip\pslabelsep\else\hss\fi}\vss}% \fi \mmultido {\n=\psk@Oy+\psk@Dy}% {\pst@cnta}% {\vbox to\pst@dima{\vss}\vbox to \z@{\vss\hbox to\z@{% \ifdim\pst@dimc>\z@\hss\else\hskip\pslabelsep\fi \psvlabel{\n}% \ifdim\pst@dimc>\z@\hskip\pslabelsep\else\hss\fi}\vss}}% \vss}} \def\psvlabel#1{$#1$} \catcode`\@=\TheAtCode\relax \endinput %% %% END pst-plot.tex