%% %% This is Package `pst-fill' %% %% Denis Girou (CNRS/IDRIS - France) %% Herbert Voss %% (C) 2003-2021 %% %% 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. %% %% DESCRIPTION: %% `pst-fill' is a PSTricks package for filling and tiling areas %% %% \pscircle[linestyle=none,fillstyle=solid,fillcolor=yellow,fillsep=0.5, %% addfillstyle=boxfill](2,2){2} \ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi \ifx\PSTXKeyLoaded\endinput\else\input pst-xkey\fi \def\fileversion{1.02} \def\filedate{2021/10/01} \message{`PST-Fill' v\fileversion, \filedate\space (tvz,dg,hv)} \csname PSTboxfillLoaded\endcsname \let\PSTboxfillLoaded\endinput \edef\PstAtCode{\the\catcode`\@}\catcode`\@=11\relax \pst@addfams{pst-fill} \def\pst@@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} \define@key[psset]{pst-fill}{boxfillsize}{% \def\pst@tempg{#1}\def\pst@temph{auto}% \ifx\pst@tempg\pst@temph \let\psk@boxfillsize\relax \else \pst@@boxfillsize#1(\z@,\z@)\@empty(\z@,\z@)(\@nil \fi} \psset{boxfillsize={(-15cm,-15cm)(15cm,15cm)}} \define@key[psset]{pst-fill}{boxfillcolor}{\pst@getcolor{#1}\psboxfillcolor} \psset{boxfillcolor=black}% hv \define@key[psset]{pst-fill}{boxfillangle}{\pst@getangle{#1}\psk@boxfillangle} \psset{boxfillangle=0} \define@key[psset]{pst-fill}{fillsepx}{\pst@getlength{#1}\psk@fillsepx} \define@key[psset]{pst-fill}{fillsepy}{\pst@getlength{#1}\psk@fillsepy} \define@key[psset]{pst-fill}{fillsep}{% \pst@getlength{#1}\psk@fillsepx% \let\psk@fillsepy\psk@fillsepx} \psset{fillsep=2pt} \ifx\PstTiling\@undefined \define@key[psset]{pst-fill}{fillcycle}{\pst@getint{#1}\psk@fillcycle} \psset{fillcycle=0} \else \define@key[psset]{pst-fill}{fillangle}{\pst@getangle{#1}\psk@boxfillangle} \define@key[psset]{pst-fill}{fillsize}{% \def\pst@tempg{#1}\def\pst@temph{auto}% \ifx\pst@tempg\pst@temph\let\psk@boxfillsize\relax \else\pst@@boxfillsize#1(\z@,\z@)\@empty(\z@,\z@)(\@nil\fi} \psset{fillsep=0,fillsize=auto} \define@key[psset]{pst-fill}{fillcyclex}{\pst@getint{#1}\psk@fillcyclex} \define@key[psset]{pst-fill}{fillcycley}{\pst@getint{#1}\psk@fillcycley} \define@key[psset]{pst-fill}{fillcycle}{% \pst@getint{#1}\psk@fillcyclex\let\psk@fillcycley\psk@fillcyclex} \psset{fillcycle=0} \define@key[psset]{pst-fill}{fillmovex}{\pst@getlength{#1}\psk@fillmovex} \define@key[psset]{pst-fill}{fillmovey}{\pst@getlength{#1}\psk@fillmovey} \define@key[psset]{pst-fill}{fillmove}{% \pst@getlength{#1}\psk@fillmovex\let\psk@fillmovey\psk@fillmovex} \psset{fillmove=0pt} \define@key[psset]{pst-fill}{fillloopaddx}{\pst@getint{#1}\psk@fillloopaddx} \define@key[psset]{pst-fill}{fillloopaddy}{\pst@getint{#1}\psk@fillloopaddy} \define@key[psset]{pst-fill}{fillloopadd}{% \pst@getint{#1}\psk@fillloopaddx\let\psk@fillloopaddy\psk@fillloopaddx} \psset{fillloopadd=0} %% \define@key[psset]{pst-fill}{PstDebug}{\pst@getint{#1}\psk@PstDebug} \psset{PstDebug=0} \fi \def\pstFillSetDefaults{% \psset{% boxfillsize={(-15cm,-15cm)(15cm,15cm)}, boxfillcolor=black, boxfillangle=0, fillsep=2pt, fillsep=0,fillsize=auto, fillcycle=0, fillmove=0pt, fillloopadd=0, PstDebug=0}% } \def\txfillDict{ fill@Dict begin } \newbox\pst@fillbox \def\psboxfill{\pst@killglue\pst@makebox\psboxfill@i} \def\psboxfill@i{\null\setbox\pst@fillbox\box\pst@hbox\ignorespaces}% \null to prevent empty page \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} \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 %% DG modification begin - Dec. 11, 1997 - Patch 2 \ifx\PstTiling\@undefined \ifnum\psk@fillcycle=\z@\pst@ManualFillCycle\fi \else \ifnum\psk@fillcyclex=\z@\pst@ManualFillCycle\fi \fi %% DG modification end \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{% \ifx\PstTiling\@undefined \pst@cntg=\psk@fillcycle \else \pst@cntg=\psk@fillcyclex \fi \pst@dimg=\wd\pst@fillbox \ifnum\pst@cntg=\z@ \else \divide\pst@dimg\pst@cntg \fi \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}} \ifx\PstTiling\@undefined \pst@def{AutoFillCycle}<% fill@Dict begin /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 end > \pst@def{BoxFill}<% fill@Dict begin 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 \ifx\VTeXversion\undefined \else neg \fi 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 (DG) CP x y1 T moveto Box end currentpoint currentfont grestore setfont moveto > \else% Tiling is defined ----------------------------------- \pst@def{AutoFillCycleX}< % fill@Dict begin /cX ED /nX 0 def /CycleX { /x x w cX div nX mul add def /nX nX cX abs 1 sub lt { nX 1 add } { 0 } ifelse def } def % end > \pst@def{AutoFillCycleY}<% % fill@Dict begin /cY ED /mY 0 def /nY 0 def /CycleY { /y1 y1 h cY div mY mul sub def nY cY abs 1 sub lt { /nY nY 1 add def /mY 1 def } { /nY 0 def /mY cY abs 1 sub neg def } ifelse } def % end > \pst@def{BoxFill}< \ifPSTlualatex /save /gsave load def /restore /grestore load def fill@Dict begin \fi gsave gsave \tx@STV CM grestore dtransform CM idtransform abs /h ED abs /w ED pathbbox \ifPSTlualatex h div 2 add cvi /y2 ED w div 2 add cvi /x2 ED h div 2 sub cvi /y1 ED w div 2 sub cvi /x1 ED \else 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 \fi /CoefLoopX 0 def /CoefLoopY 0 def /CoefMoveX 0 def /CoefMoveY 0 def \psk@boxfillangle\space 0 ne {/CoefLoopX 8 def /CoefLoopY 8 def} if \psk@fillcyclex\space 0 ne {/CoefLoopX CoefLoopX 1 add def} if \psk@fillcycley\space 0 ne {/CoefLoopY CoefLoopY 1 add def} if \psk@fillmovex\space 0 ne {/CoefLoopX CoefLoopX 2 add def \psk@fillmovex\space 0 gt {/CoefMoveX CoefLoopX def} {/CoefMoveX CoefLoopX neg def} ifelse} if \psk@fillmovey\space 0 ne {/CoefLoopY CoefLoopY 2 add def \psk@fillmovey\space 0 gt {/CoefMoveY CoefLoopY def} {/CoefMoveY CoefLoopY neg def} ifelse} if \psk@fillsepx\space 0 ne {/CoefLoopX CoefLoopX 1 add def} if \psk@fillsepy\space 0 ne {/CoefLoopY CoefLoopY 1 add def} if /CoefLoopX CoefLoopX \psk@fillloopaddx\space add def /CoefLoopY CoefLoopY \psk@fillloopaddy\space add def /x2 x2 x1 sub 4 sub CoefLoopX 2 mul add def /y2 y2 y1 sub 4 sub CoefLoopY 2 mul add def %% We must fix the origin of tiling, as it must not vary according other stuff in the page! w x1 CoefLoopX add CoefMoveX add mul h y1 y2 add 1 sub CoefLoopY sub CoefMoveY sub mul moveto CP y1 h mul sub neg /y1 ED x1 w mul sub neg /x1 ED \Pst@Debug 0 eq {clip} if \psk@fillmovex\space \psk@fillmovey gsave \tx@STV CM grestore dtransform CM idtransform /hmove ED /wmove ED /row 0 def y2 { /row row 1 add def /column 0 def /x x1 def CycleX save x2 { /column column 1 add def CycleY save CP x y1 \ifPSTlualatex neg \fi T moveto Box restore /x x w add def 0 hmove translate } repeat restore /y1 y1 h add def wmove 0 translate } repeat currentpoint currentfont grestore setfont moveto \ifPSTlualatex end \fi > \fi % edn of tiling=true \ifPSTlualatex \def\pst@AutoBoxFill{% \leavevmode \begingroup \pst@stroke \pst@FlushCode \pst@Verb{\psk@boxfillangle\space \tx@RotBegin}% \pstVerb{ \pst@dict /Box [ /gsave cvx currentpoint /translate cvx \luaPSTbox\hbox{% \ifx\PstTiling\@undefined \else \ifx\pst@tempa\@undefined % Undefined for instance for \pscharpath \else\ifx\pst@tempa\@empty\else \def\pst@temph{0}% \ifx\pst@tempa\pst@temph \else \fi \fi\fi \fi \hbox to \z@{\vbox to\z@{\vss\copy\pst@fillbox\vskip-\dp\pst@fillbox}\hss}% } /.TeXBox findresource /grestore cvx ] cvx def \ifx\PstTiling\@undefined \ifnum\psk@fillcycle=\z@ /s {} def \else \psk@fillcycle \tx@AutoFillCycle \fi \else \ifnum\psk@fillcyclex=\z@ /CycleX {} def \else \psk@fillcyclex\space \tx@AutoFillCycleX \fi \ifnum\psk@fillcycley=\z@ /CycleY {} def \else \psk@fillcycley\space \tx@AutoFillCycleY \fi \fi \pst@number{\wd\pst@fillbox}% \psk@fillsepx\space add \pst@number{\ht\pst@fillbox}% \pst@number{\dp\pst@fillbox}% \psk@fillsepy\space add add \tx@BoxFill end }% \pst@Verb{\tx@RotEnd}% \endgroup} \else%%%%%%%%%%%%%%% latex->dvips definition \def\pst@AutoBoxFill{% \leavevmode \begingroup \pst@stroke \pst@FlushCode \pst@Verb{\psk@boxfillangle\space \tx@RotBegin}% \pstVerb{\pst@dict /Box \pslbrace end}% \ifx\PstTiling\@undefined \else \ifx\pst@@tempA\@undefined % Undefined for instance for \pscharpath \else\ifx\pst@@tempA\@empty\else \def\pst@temph{0}% \ifx\pst@@tempA\pst@temph \else \pstVerb{/TR {pop pop currentpoint translate \pst@@tempA\space translate } def}% \fi \fi\fi \fi \hbox to \z@{\vbox to\z@{\vss\copy\pst@fillbox\vskip-\dp\pst@fillbox}\hss}% \ifx\PstTiling\@undefined \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\space add \pst@number{\ht\pst@fillbox}% \pst@number{\dp\pst@fillbox}% \psk@fillsepy\space add add \tx@BoxFill end}% \else \pstVerb{% tx@Dict begin \psrbrace def \ifnum\psk@fillcyclex=\z@ /CycleX {} def \else \psk@fillcyclex\space \tx@AutoFillCycleX \fi \ifnum\psk@fillcycley=\z@ /CycleY {} def \else \psk@fillcycley\space \tx@AutoFillCycleY \fi \pst@number{\wd\pst@fillbox}% \psk@fillsepx\space add \pst@number{\ht\pst@fillbox}% \pst@number{\dp\pst@fillbox}% \psk@fillsepy\space add add \tx@BoxFill end}% \fi \pst@Verb{\tx@RotEnd}% \endgroup} \fi % \catcode`\@=\PstAtCode\relax \endinput %% %% End of file `pst-fill.tex'.