%% BEGIN pst-fill.tex %% %% Defines the \psboxfill macro. %% For use with PSTricks v0.94 (or perhaps later). %% \def\fileversion{0.94-97} \def\filedate{1997/04/08} %% %% COPYRIGHT 1994, by Timothy Van Zandt, tvz@Princeton.EDU %% See pstricks.tex or pstricks.doc for copying restrictions. %% Note (D.G. - 8 April 97): %% * Without \PstTilingtrue defined (or "tiling" optional parameter %% on \usepackage[tiling]{pst-fill}), this file run exactly as %% the original boxfill.tex file from Timothy, version 0.94, %% except a correction in \pst@ManualFillCycle to avoid %% a division by 0. %% It's the default. %% * With \PstTilingtrue defined (or "tiling" optional parameter %% on \usepackage[tiling]{pst-fill}) there are several add-ons %% and changes to do `tiling' rather than `filling' %% (we must fix position of beginning of tiling and we allow %% overriding of tiles using fillmovex and fillmovey parameters). % Preliminaries: \message{ v\fileversion, \filedate} \csname PSTboxfillLoaded\endcsname \let\PSTboxfillLoaded\endinput \ifx\PSTricksLoaded\endinput\else \def\next{\input pstricks.tex} \expandafter\next \fi \edef\TheAtCode{\the\catcode`\@} \catcode`\@=11 % The box: \newbox\pst@fillbox \def\psboxfill{\pst@killglue\pst@makebox\psboxfill@i} \def\psboxfill@i{\setbox\pst@fillbox\box\pst@hbox\ignorespaces} % Parameters: \def\psset@boxfillsize#1{% \def\pst@tempg{#1}\def\pst@temph{auto}% \ifx\pst@tempg\pst@temph \let\psk@boxfillsize\relax \else \psset@@boxfillsize#1(\z@,\z@)\@empty(\z@,\z@)(\@nil \fi} \def\psset@@boxfillsize#1(#2,#3)#4(#5,#6)#7(#8\@nil{% \begingroup \ifx\@empty#7\relax \pst@dima\z@ \pst@dimb\z@ \pssetxlength\pst@dimc{#2}% \pssetylength\pst@dimd{#3}% \else \pssetxlength\pst@dima{#2}% \pssetylength\pst@dimb{#3}% \pssetxlength\pst@dimc{#5}% \pssetylength\pst@dimd{#6}% \fi \xdef\pst@tempg{% \pst@dima=\number\pst@dima sp \pst@dimb=\number\pst@dimb sp \pst@dimc=\number\pst@dimc sp \pst@dimd=\number\pst@dimd sp }% \endgroup \let\psk@boxfillsize\pst@tempg} \psset{boxfillsize={(-15cm,-15cm)(15cm,15cm)}} \def\psset@boxfillcolor#1{\pst@getcolor{#1}\psboxfillcolor} \psset@boxfillcolor{black} \def\psset@boxfillangle#1{\pst@getangle{#1}\psk@boxfillangle} \psset@boxfillangle{0} \def\psset@fillsepx#1{\pst@getlength{#1}\psk@fillsepx} \def\psset@fillsepy#1{\pst@getlength{#1}\psk@fillsepy} \def\psset@fillsep#1{\psset@fillsepx{#1}\let\psk@fillsepy\psk@fillsepx} \psset@fillsep{2pt} \def\psset@fillcycle#1{\pst@getint{#1}\psk@fillcycle} \psset@fillcycle{0} % Modification Denis GIROU (CNRS/IDRIS - France) - 8 Apr. 1997 \ifx\PstTiling\@undefined \else % Define fillloopcoef parameter \def\psset@fillloopcoef#1{\pst@getint{#1}\psk@fillloopcoef} \psset@fillloopcoef{12} % Define fillmove, fillmovex and fillmovey parameters for tiling \def\psset@fillmovex#1{\pst@getlength{#1}\psk@fillmovex} \def\psset@fillmovey#1{\pst@getlength{#1}\psk@fillmovey} \def\psset@fillmove#1{\psset@fillmovex{#1}\let\psk@fillmovey\psk@fillmovex} \psset@fillmove{0pt} \fi % End modification D.G. % Main macro: \def\psfs@boxfill{% \ifvoid\pst@fillbox \@pstrickserr{Fill box is empty. Use \string\psboxfill\space first.}\@ehpa \else \ifx\psk@boxfillsize\relax \pst@AutoBoxFill \else \pst@ManualBoxFill \fi \fi} % Manual box fill: \def\pst@ManualBoxFill{% \leavevmode \begingroup \pst@FlushCode \begin@psclip \pstVerb{clip}% \expandafter\pst@AddFillBox\psk@boxfillsize \end@psclip \endgroup} \def\pst@FlushCode{% \pst@Verb{% /mtrxc CM def CP CP T \tx@STV \psk@origin \psk@swapaxes \pst@newpath \pst@code mtrxc setmatrix moveto 0 setgray}% \gdef\pst@code{}} \def\pst@AddFillBox#1 #2 #3 #4 {% \begingroup \setbox\pst@fillbox=\vbox{% \hbox{\unhcopy\pst@fillbox\kern\psk@fillsepx\p@}% \vskip\psk@fillsepy\p@}% \psk@boxfillsize \pst@cnta=\pst@dimc \advance\pst@cnta-\pst@dima \divide\pst@cnta\wd\pst@fillbox \pst@cntb=\pst@dimd \advance\pst@cntb-\pst@dimb \pst@dimd=\ht\pst@fillbox \divide\pst@cntb\pst@dimd \def\pst@tempa{% \pst@tempg \copy\pst@fillbox \advance\pst@cntc\@ne \ifnum\pst@cntc<\pst@cntd\expandafter\pst@tempa\fi}% \let\pst@tempg\relax \pst@cntc-\tw@ \pst@cntd\pst@cnta \setbox\pst@fillbox=\hbox to \z@{% \kern\pst@dima \kern-\wd\pst@fillbox \pst@tempa \hss}% \pst@cntd\pst@cntb \ifnum\psk@fillcycle=\z@\pst@ManualFillCycle\fi \global\setbox\pst@boxg=\vbox to\z@{% \offinterlineskip \vss \pst@tempa \vskip\pst@dimb}% \endgroup \setbox\pst@fillbox\box\pst@boxg \pst@rotate\psk@boxfillangle\pst@fillbox \box\pst@fillbox} \def\pst@ManualFillCycle{% \pst@cntg=\psk@fillcycle \pst@dimg=\wd\pst@fillbox % Modification Denis GIROU (CNRS/IDRIS - France) - 20 Mar. 1997 % To avoid division by 0 % \divide\pst@dimg\pst@cntg \ifnum\pst@cntg=\z@ \else \divide\pst@dimg\pst@cntg \fi % End modification D.G. \ifnum\pst@cntg<\z@\pst@cntg=-\pst@cntg\fi \advance\pst@cntg\m@ne \pst@cnth=\pst@cntg \def\pst@tempg{% \ifnum\pst@cnth<\pst@cntg\advance\pst@cnth\@ne\else\pst@cnth\z@\fi \moveright\pst@cnth\pst@dimg}} % Auto box fill: !! Fix dictionary \pst@def{AutoFillCycle}<% /c ED /n 0 def /s { /x x w c div n mul add def /n n c abs 1 sub lt { n 1 add } { 0 } ifelse def } def> % Modification Denis GIROU (CNRS/IDRIS - France) - 8 Apr. 1997 \ifx\PstTiling\@undefined % Original version \pst@def{BoxFill}<% gsave gsave \tx@STV CM grestore dtransform CM idtransform abs /h ED abs /w ED pathbbox h div round 2 add cvi /y2 ED w div round 2 add cvi /x2 ED h div round 2 sub cvi /y1 ED w div round 2 sub cvi /x1 ED /y2 y2 y1 sub def /x2 x2 x1 sub def CP y1 h mul sub neg /y1 ED x1 w mul sub neg /x1 ED clip y2 { /x x1 def s x2 { save CP x y1 T moveto Box restore /x x w add def } repeat /y1 y1 h add def } repeat % Next line not useful... To see that, suppress clipping (D.G.) CP x y1 T moveto Box currentpoint currentfont grestore setfont moveto> \else % Modified version (D.G.) \pst@def{BoxFill}<% gsave gsave \tx@STV CM grestore dtransform CM idtransform abs /h ED abs /w ED pathbbox h div round 2 add cvi /y2 ED w div round 2 add cvi /x2 ED h div round 2 sub cvi /y1 ED w div round 2 sub cvi /x1 ED % Modification Denis GIROU (CNRS/IDRIS - France) - 6 Mar. 1997 % We must fix the origin of tiling, and it must not vary according other stuff % in the page! % It's clearly not the best solution and it slow it really but nevertheless % it's better than nothing... % /y2 y2 y1 sub def % /x2 x2 x1 sub def w x1 \psk@fillloopcoef add mul h y1 \psk@fillloopcoef add mul moveto /y2 y2 y1 sub \psk@fillloopcoef add def /x2 x2 x1 sub \psk@fillloopcoef add def % End modification D.G. CP y1 h mul sub neg /y1 ED x1 w mul sub neg /x1 ED clip % Modification Denis GIROU (CNRS/IDRIS - France) - 8 Apr. 1997 % y2 { % /x x1 def % s % x2 { % save CP x y1 T moveto Box restore % /x x w add def % } repeat % /y1 y1 h add def % } repeat % CP x y1 T moveto Box \psk@fillmovex \psk@fillmovey gsave \tx@STV CM grestore dtransform CM idtransform /hmove ED /wmove ED save y2 { /x x1 def s save x2 { save CP x y1 T moveto Box restore /x x w add def 0 hmove translate } repeat restore /y1 y1 h add def wmove 0 translate } repeat restore % End modification D.G. currentpoint currentfont grestore setfont moveto> \fi \def\pst@AutoBoxFill{% \leavevmode \begingroup \pst@FlushCode \pst@Verb{\psk@boxfillangle \tx@RotBegin}% \pstVerb{\pst@dict /Box \pslbrace end}% % Modification Denis GIROU (CNRS/IDRIS - France) - 10 Mar. 1997 \ifx\PstTiling\@undefined \else \def\pst@temph{0}% \ifx\pst@tempa\pst@temph \else \pstVerb{/TR{pop pop currentpoint translate \pst@tempa translate}def}% \fi \fi % End modification D.G. \hbox to \z@{\vbox to\z@{\vss\copy\pst@fillbox\vskip-\dp\pst@fillbox}\hss}% \pstVerb{% tx@Dict begin \psrbrace def \ifnum\psk@fillcycle=\z@ /s {} def \else \psk@fillcycle \tx@AutoFillCycle \fi \pst@number{\wd\pst@fillbox}% \psk@fillsepx add \pst@number{\ht\pst@fillbox}% \pst@number{\dp\pst@fillbox}% \psk@fillsepy add add \tx@BoxFill end}% \pst@Verb{\tx@RotEnd}% \endgroup} \catcode`\@=\TheAtCode\relax \endinput %% END pst-fill.tex