0% found this document useful (0 votes)
88 views37 pages

PST Fill

This document describes the pst-fill package for PSTricks, which allows filling and tiling areas with patterns. The package was originally written in 1994 but updated in 1997 to add a tiling mode that controls the starting point, enabling true tilings. It summarizes the package's history, provides examples of different tile types, and includes the package code.

Uploaded by

Ambeswar Phukon
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
88 views37 pages

PST Fill

This document describes the pst-fill package for PSTricks, which allows filling and tiling areas with patterns. The package was originally written in 1994 but updated in 1997 to add a tiling mode that controls the starting point, enabling true tilings. It summarizes the package's history, provides examples of different tile types, and includes the package code.

Uploaded by

Ambeswar Phukon
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 37

pst-fill

A PSTricks package for filling and tiling areas


Timothy Van Zandt∗
March 11, 2007— Version 1.00
Documentation revised March 11, 2007

Contents
1 Introduction 2

2 Package history and description of it two different modes 2


2.1 Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3 Examples 7
3.1 Kind of tiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 External graphic files . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Tiling of characters . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.4 Other kinds of usage . . . . . . . . . . . . . . . . . . . . . . . . . . 16

4 “Dynamic” tilings 17
4.1 Lewthwaite-Pickover-Truchet tiling . . . . . . . . . . . . . . . . . . 17
4.2 A complete example: the Poisson equation . . . . . . . . . . . . . . 22

5 Driver file 25

6 pst-fill LATEX wrapper 26

7 Pst-Fill Package code 26


7.1 Preamble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
7.2 The size of the box . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
7.3 Definition of the parameters . . . . . . . . . . . . . . . . . . . . . . 27
7.4 Definition of the fill box . . . . . . . . . . . . . . . . . . . . . . . . 29
7.5 The main macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7.6 The PostScript subroutines . . . . . . . . . . . . . . . . . . . . . . 31
7.7 Closing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
[email protected]. (documentation by Denis Girou ([email protected]) and Herbert

Voß([email protected]).

1
Abstract
‘pst-fill’ is a PSTricks (13), (6), (14), (9), (7) package to draw easily
various kinds of filling and tiling of areas. It is also a good example of the
great power and flexibility of PSTricks, as in fact it is a very short program
(it body is around 200 lines long) but nevertheless really powerful.
It was written in 1994 by Timothy van Zandt but publicly available
only in PSTricks 97 and without any documentation. We describe here the
version 97 patch 2 of December 12, 1997, which is the original one modified
by myself to manage tilings in the so-called automatic mode. This article
would like to serve both of reference manual and of user’s guide.
This package is available on CTAN in the graphics/pstricks directory
(files latex/pst-fill.sty and generic/pst-fill.tex).

1 Introduction
Here we will refer as filling as the operation which consist to fill a defined area by
a pattern (or a composition of patterns). We will refer as tiling as the operation
which consist to do the same thing, but with the control of the starting point,
which is here the upper left corner. The pattern is positioned relatively to this
point. This make an essential difference between the two modes, as without control
of the starting point we can’t draw tilings (sometimes called tesselations) as used
in many fields of Art and Science 1 .
Nevertheless, as tilings are a wide and difficult field in mathematics, this pack-
age is limited to simple ones, mainly monohedral tilings with one prototile (which
can be composite, see section 3.1). With some experience and wiliness we can do
more and obtained easily rather sophisticated results, but obviously hyperbolic
tilings like the famous Escher ones or aperiodic tilings like the Penrose ones
are not in the capabilities of this package. For more complex needs, we must used
low level and more painfull technics, with the basic \multido and \multirput
macros.

2 Package history and description of it two dif-


ferent modes
As already said, this package was written in 1994 by Timothy van Zandt. Two
modes were defined, called respectively manual and automatic. For both, the
pattern is generated on contiguous positions in a rather large area which include
the region to fill, later cut to the required dimensions by clipping mechanism. In
1 For an extensive presentation of tilings, in their history and usage in many fields, see the

reference book (8).


In the TEX world, few work was done on tilings. You can look at the tile extension of the
XY-pic package (10), at the articles of Kees van der Laan (11, paragraph 7) (the tiling
was in fact directly done in PostScript) and (12), at the METAPOST program (available
on graphics/metapost/contrib/macros/truchet) by Denis Roegel for the Truchet contest in
1995 (5) and at the METAPOST package (2) to draw patterns, which have a strong connection
with tilings.

2
the first mode, the pattern is explicitely inserted in the PostScript file each time.
In the second one, the result is the same but with an unique explicit insertion of
the pattern and a repetition done by PostScript. Nevertheless, in this method,
the control of the starting point was loosed, so it allowed only to fill a region and
not to tile it.

See the difference between the two modes, tiling: and filling:

or as we can see that initial position is arbitrary and


dependent of the current point.
It’s clear that usage of filling is very restrictive comparing to tiling, as desired
effects required very often the possibility to control the starting point. So, this
mode was of limited interest, but unfortunately the manual one has the very big
disadvantage to require very huge amounts of ressources, mainly in disk space
and consequently in printing time. A small tiling can require sometimes several
megabytes in manual mode! So, it was very often not really usable in practice.
It is why I modified the code, to allow tilings in automatic mode, controlling
in this mode too the starting point. And most of the time, that is to say if some
special options are not used, the tiling is done exactly in the region described,
which make it faster. So there is no more reason to use the manual mode, apart
very special cases where automatic one cannot work, as explained later – currently,
I know only one case.
To load this modified automatic mode, with LATEX use simply:
\usepackage[tiling]{pst-fill}
and in plain TEX after:
\input{pst-fill}
add the following definition:
\def\PstTiling{true}
To obtain the original behaviour, just don’t use the tiling optional keyword at
loading.
Take care than in tiling mode, I introduce also some other changes. First I
define aliases on some parameter names for consistancy (all specific parameters
will begin by the fill prefix in this case) and I change some default values, which
were not well adapted for tilings (fillsep is set to 0 and as explained fillsize set
to auto). I rename fillcycle to fillcyclex. I also restore normal way so that
the frame of the area is drawn and all line (linestyle, linecolor, doubleline,
etc.) parameters are now active (but there are not in non tiling mode). And I
also introduce new parameters to control the tilings (see below).
In all the following examples, we will consider only the tiling mode.
To do a tiling, we have just to define the pattern with the \psboxfill macro
and to use the new fillstyle boxfill.

3
Note that tilings are drawn from left to right and top to bottom, which can
have an importance in some circonstances.
PostScript programmers can be also interested to know that, even in the auto-
matic mode, the iterations of the pattern are managed directly by the PostScript
code of the package which used only PostScript Level 1 operators. The special
ones introduced in Level 2 for drawing of patterns (1, section 4.9) are not used.
And first, for conveniance, we define a simple \Tiling macro, which will sim-
plify our examples:

\newcommand{\Tiling}[2][]{%
\edef\Temp{#1}%
\begin{pspicture}#2
\ifx\Temp\empty
\psframe[fillstyle=boxfill]#2
\else
\psframe[fillstyle=boxfill,#1]#2
\fi
\end{pspicture}}

2.1 Parameters
There are 14 specific parameters available to change the way the filling/tiling is
defined, and one debugging option.

fillangle (real): the value of the rotation applied to the patterns (Default: 0).

In this case, we must force the tiling area to be notably larger than the area
to cover, to be sure that the defined area will be covered after rotation.
1 \newcommand{\Square}{%
2 \begin{pspicture}(1,1)
3 \psframe[dimen=middle](1,1)
4 \end{pspicture}}
5 \psset{unit=0.5}
6 \psboxfill{\Square}
7 \Tiling[fillangle=45]{(3,3)}\quad
8 \Tiling[fillangle=-60]{(3,3)}

fillsepx (realkdim) : value of the horizontal separation between consecutive pat-


terns (Default: 0 for tilings2 , 2pt otherwise).
fillsepy (realkdim): value of the vertical separation between consecutive patterns
(Default: 0 for tilings2 , 2pt otherwise).
fillsep (realkdim): value of horizontal and vertical separations between consecu-
tive patterns (Default: 0 for tilings2 , 2pt otherwise).

These values can be negative, which allow the tiles to overlap.


2 This option was added by me, is not part of the original package and is available only if the

tiling keyword is used when loading the package.

4
1 \psset{unit=0.5}
2 \psboxfill{\Square}
3 \Tiling[fillsepx=2mm]{(3,3)}
4 \Tiling[fillsepy=1mm]{(3,3)}\\
5 \Tiling[fillsep=0.5]{(3,3)}
6 \Tiling[fillsep=-0.5]{(3,3)}

fillcyclex3 (integer): Shift coefficient applied to each row (Default: 0).


fillcycley2 (integer): Same thing for columns (Default: 0).
fillcycle2 (integer): Allow to fix both fillcyclex and fillcycley directly to
the same value (Default: 0).

For instance, if fillcyclex is 2, the second row of patterns will be horizontally


shifted by a factor of 21 = 0.5, and by a factor of 0.333 if fillcyclex is 3, etc.).
These values can be negative.

1 \psset{unit=0.5}
2 \psboxfill{\Square}
3 \newcommand{\TilingA}[1]{\Tiling[fillcyclex
=#1]{(3,3)}}
4 \TilingA{0} \TilingA{1}\\
5 \TilingA{2} \TilingA{3}\\[3mm]
6 \TilingA{4} \TilingA{5}\\
7 \TilingA{6} \TilingA{-3}\\[3mm]
8 \Tiling[fillcycley=2]{(3,3)}
9 \Tiling[fillcycley=3]{(3,3)}\\
10 \Tiling[fillcycley=-3]{(3,3)}
11 \Tiling[fillcycle=2]{(3,3)}

fillmovex2 (realkdim): value of the horizontal moves between consecutive patterns


(Default: 0).
3 It was fillcycle in the original version.

5
fillmovey2 (realkdim): value of the vertical moves between consecutive patterns
(Default: 0).
fillmove2 (realkdim): value of horizontal and vertical moves between consecutive
patterns (Default: 0).

These parameters allow the patterns to overlap and to draw some special kinds
of tilings. They are implemented only for the automatic and tiling modes and their
values can be negative.
In some cases, the effect of these parameters will be the same that with the
fillcycle? ones, but you can see that it is not true for some other values.

1 \psset{unit=0.5}
2 \psboxfill{\Square}
3 \Tiling[fillmovex=0.5]{(3,3)}
4 \Tiling[fillmovey=0.5]{(3,3)}\\
5 \Tiling[fillmove=0.5]{(3,3)}
6 \Tiling[fillmove=-0.5]{(3,3)}

fillsize (autok{(realkdim,realkdim)(realkdim,realkdim)}) : The choice of auto-


matic mode or the size of the area in manual mode. If first pair
values are not given, (0,0) is used. (Default: auto when tiling mode
is used, (-15cm,-15cm)(15cm,15cm) otherwise).

As explained in the introduction, the manual mode can require very huge
amount of computer ressources. So, it usage is to discourage in front off the
automatic mode. It seems only useful in special circonstances, in fact when the
automatic mode failed, which is known only in one case, for some kinds of EPS
files, as the ones produce by dump of portions of screens (see 3.2).

fillloopaddx2 (integer): number of times the pattern is added on left and right
positions (Default: 0).
fillloopaddy2 (integer): number of times the pattern is added on top and bottom
positions (Default: 0).
fillloopadd2 (integer): number of times the pattern is added on left, right, top
and bottom positions (Default: 0).

These parameters are only useful in special circonstances, as for complex pat-
terns when the size of the rectangular box used to tile the area doesn’t correspond
to the pattern itself (see an example in Figure 3.1) and also sometimes when the
size of the pattern is not a divisor of the size of the area to fill and that the number
of loop repeats is not properly computed, which can occur.
They are implemented only for the tiling mode.

PstDebug2 (integer, 0 or 1): to require to see the exact tiling done, without clipping
(Default: 0).

6
It’s mainly useful for debugging or to understand better how the tilings are
done. It is implemented only for the tiling mode.

1 \psset{unit=0.3,PstDebug=1}
2 \psboxfill{\Square}
3 \psset{linewidth=1mm}
4 \Tiling{(2,2)}\\[5mm]
5 \Tiling[fillcyclex=2]{(2,2)}\\[1cm]
6 \Tiling[fillmove=0.5]{(2,2)}

3 Examples
In fact this unique \psboxfill macro allow a lot a variations and different usages.
We will try here to demonstrate this.

3.1 Kind of tiles


Of course, we can access to all the power of PSTricks macros to define the tiles
(patterns) used. So, we can define complicated ones.
Here we give four other Archimedian tilings (those built with only some reg-
ular polygons) among the twelve existing, first discovered completely by Johanes
Kepler at the beginning of 17th century (8), the two other regular ones with
the tiling by squares, formed by a unique regular polygon, and two other formed
by two different regular polygons.

7
1 \newcommand{\Triangle}{%
2 \begin{pspicture}(1,1)
3 \pstriangle[dimen=middle](0.5,0)(1,1)
4 \end{pspicture}}
5 \newcommand{\Hexagon}{
6 ^^A sin(60)=0.866
7 \begin{pspicture}(0.866,0.75)
8 \SpecialCoor
9 ^^A Hexagon
10 \pspolygon[dimen=middle]%
11 (0.5;30)(0.5;90)(0.5;150)(0.5;210)(0.5;270)(0.5;330)
12 \end{pspicture}}
13
14 \psset{unit=0.5}
15 \psboxfill{\Triangle}
16 \Tiling{(4,4)}\hfill
17 ^^A The two other regular tilings
18 \Tiling[fillcyclex=2]{(4,4)}\hfill
19 \psboxfill{\Hexagon}
20 \Tiling[fillcyclex=2,fillloopaddy=1]{(5,5)}

8
1 \newcommand{\ArchimedianA}{%
2 ^^A Archimedian tiling 3^2.4.3.4
3 \psset{dimen=middle}
4 ^^A sin(60)=0.866
5 \begin{pspicture}(1.866,1.866)
6 \psframe(1,1)
7 \psline(1,0)(1.866,0.5)(1,1)(0.5,1.866)(0,1)(-0.866,0.5)
8 \psline(0,0)(0.5,-0.866)
9 \end{pspicture}}
10 \newcommand{\ArchimedianB}{%
11 ^^A Archimedian tiling 4.8^2
12 \psset{dimen=middle,unit=1.5}
13 ^^A sin(22.5)=0.3827 ; cos(22.5)=0.9239
14 \begin{pspicture}(1.3066,0.6533)
15 \SpecialCoor
16 ^^A Octogon
17 \pspolygon(0.5;22.5)(0.5;67.5)(0.5;112.5)(0.5;157.5)
18 (0.5;202.5)(0.5;247.5)(0.5;292.5)(0.5;337.5)
19 \end{pspicture}}
20
21 \psset{unit=0.5}
22 \psboxfill{\ArchimedianA}
23 \Tiling[fillmove=0.5]{(7,7)}\hfill
24 \psboxfill{\ArchimedianB}
25 \Tiling[fillcyclex=2,fillloopaddy=1]{(7,7)}

We can of course tile an area arbitrarily defined. And with the addfillstyle
parameter4, we can easily mix the boxfill style with another one.

4 Introduced in PSTricks 97.

9
1 \psset{unit=0.5,dimen=middle}
2 \psboxfill{%
3 \begin{pspicture}(1,1)
4 \psframe(1,1)
5 \pscircle(0.5,0.5){0.25}
6 \end{pspicture}}
7 \begin{pspicture}(4,6)
8 \pspolygon[fillstyle=boxfill,
fillsep=0.25](0,1)(1,4)(4,6)(4,0)
(2,1)
9 \end{pspicture}\hspace{1em}
10 \begin{pspicture}(4,4)
11 \pscircle[linestyle=none,fillstyle
=solid,fillcolor=yellow,fillsep
=0.5,
12 addfillstyle=boxfill
](2,2){2}
13 \end{pspicture}

Various effects can be obtained, sometimes complicated ones very easily, as in


this example reproduced from one shown by Slavik Jablan in the field of OpTiles,
inspired by the Op-art:

1 \newcommand{\ProtoTile}{%
2 \begin{pspicture}(1,1)%%% 1/12=0.08333
3 \psset{linestyle=none,linewidth=0,
4 hatchwidth=0.08333\psunit,hatchsep=0.08333\psunit}
5 \psframe[fillstyle=solid,fillcolor=black,addfillstyle=hlines,hatchcolor=white
](1,1)
6 \pswedge[fillstyle=solid,fillcolor=white,addfillstyle=hlines]{1}{0}{90}
7 \end{pspicture}}
8 \newcommand{\BasicTile}{%
9 \begin{pspicture}(2,1)
10 \rput[lb](0,0){\ProtoTile}\rput[lb](1,0){\psrotateleft{\ProtoTile}}
11 \end{pspicture}}
12 \ProtoTile\hfill\BasicTile\hfill
13 \psboxfill{\BasicTile}
14 \Tiling[fillcyclex=2]{(4,4)}

It is also directly possible to surimpose several different tilings. Here is the


splendid visual proof of the Pythagore theorem done by the arab mathematician
Annairizi around the year 900, given by superposition of two tilings by squares
of different sizes.

10
1 \psset{unit=1.5,dimen=middle}
2 \begin{pspicture*}(3,3)
3 \psboxfill{\begin{pspicture}(1,1)
4 \psframe(1,1)\end{pspicture}}
5 \psframe[fillstyle=boxfill](3,3)
6 \psboxfill{\begin{pspicture}(1,1)
7 \rput{-37}{\psframe[linecolor=red](0.8,0.8)}
8 \end{pspicture}}
9 \psframe[fillstyle=boxfill](3,4)
10 \pspolygon[fillstyle=hlines,hatchangle=90](1,2)(1.64,1.53)(2,2)
11 \end{pspicture*}

In a same way, it is possible to build tilings based on figurative patterns, in


the style of the famous Escher ones. Following an example of André Deledicq
(4), we first show a simple tiling of the p1 category (according to the international
classification of the 17 symmetry groups of the plane first discovered by the russian
crystalographer Jevgraf Fedorov at the end of the 19th century):

11
1 \newcommand{\SheepHead}[1]{%
2 \begin{pspicture}(3,1.5)
3 \pscustom[liftpen=2,fillstyle=solid,fillcolor=#1]{%
4 \pscurve(0.5,-0.2)(0.6,0.5)(0.2,1.3)(0,1.5)(0,1.5)
5 (0.4,1.3)(0.8,1.5)(2.2,1.9)(3,1.5)(3,1.5)(3.2,1.3)
6 (3.6,0.5)(3.4,-0.3)(3,0)(2.2,0.4)(0.5,-0.2)}
7 \pscircle*(2.65,1.25){0.12\psunit} % Eye
8 \psccurve*(3.5,0.3)(3.35,0.45)(3.5,0.6)(3.6,0.4)% Muzzle
9 ^^A % Mouth
10 \pscurve(3,0.35)(3.3,0.1)(3.6,0.05)
11 ^^A % Ear
12 \pscurve(2.3,1.3)(2.1,1.5)(2.15,1.7)\pscurve(2.1,1.7)(2.35,1.6)(2.45,1.4)
13 \end{pspicture}}
14 \psboxfill{\psset{unit=0.5}\SheepHead{yellow}\SheepHead{cyan}}
15 \Tiling[fillcyclex=2,fillloopadd=1]{(10,5)}

Now a tiling of the pg category (the code for the kangaroo itself is too long to
be shown here, but has no difficulties ; the kangaroo is reproduce from an original
picture from Raoul Raba and here is a translation in PSTricks from the one drawn
by Emmanuel Chailloux and Guy Cousineau for their MLgraph system (3)):

12
1 \psboxfill{\psset{unit=0.4}
2 \Kangaroo{yellow}\Kangaroo{red}\Kangaroo{cyan}\Kangaroo{green}%
3 \psscalebox{-1 1}{%
4 \rput(1.235,4.8){\Kangaroo{green}\Kangaroo{cyan}\Kangaroo{red}\Kangaroo{
yellow}}}}
5 \Tiling[fillloopadd=1]{(10,6)}

And here a Wang tiling (16), (8, chapter 11), based on very simple tiles
of the form of a square and composed of four colored triangles. Such tilings
are built with only a matching color constraint. Despite of it simplicity, it is an
important kind of tilings, as Wang and others used them to study the special class
of aperiodic tilings, and also because it was shown that surprisingly this tiling is
similar to a Turing machine.

13
1 \newcommand{\WangTile}[4]{%
2 \begin{pspicture}(1,1)
3 \pspolygon*[linecolor=#1](0,0)(0,1)(0.5,0.5)
4 \pspolygon*[linecolor=#2](0,1)(1,1)(0.5,0.5)
5 \pspolygon*[linecolor=#3](1,1)(1,0)(0.5,0.5)
6 \pspolygon*[linecolor=#4](1,0)(0,0)(0.5,0.5)
7 \end{pspicture}}
8 \newcommand{\WangTileA}{\WangTile{cyan}{yellow}{cyan}{cyan}}
9 \newcommand{\WangTileB}{\WangTile{yellow}{cyan}{cyan}{red}}
10 \newcommand{\WangTileC}{\WangTile{cyan}{red}{yellow}{yellow}}
11 \newcommand{\WangTiles}[1][]{%
12 \begin{pspicture}(3,3) \psset{ref=lb}
13 \rput(0,2){\WangTileB} \rput(1,2){\WangTileA}%
14 \rput(2,2){\WangTileC} \rput(0,1){\WangTileC}%
15 \rput(1,1){\WangTileB} \rput(2,1){\WangTileA}
16 \rput(0,0){\WangTileA} \rput(1,0){\WangTileC}%
17 \rput(2,0){\WangTileB}
18 #1
19 \end{pspicture}}
20 \WangTileA\hfill\WangTileB\hfill\WangTileC\hfill
21 \WangTiles[{\psgrid[subgriddiv=0,gridlabels=0](3,3)}]\hfill
22 \psset{unit=0.4} \psboxfill{\WangTiles} \Tiling{(12,12)}

3.2 External graphic files


We can also fill an arbitrary area with an external image. We have only, as usual,
to matter of the BoundingBox definition if there is no one provided or if it is not
the accurate one, as for the well known tiger picture part of the ghostscript
distribution.

14
1 \psboxfill{%% Strangely require x1=x2...
2 \begin{pspicture}(0,1)(0,4.1)
3 \includegraphics[bb=17 176 560 74,width=3cm]{tiger}
4 \end{pspicture}}
5 \Tiling{(6,6.2)}

Nevertheless, there are some special files for which the automatic mode doesn’t
work, specially for some files obtained by a screen dump, as in the next example,
where a picture was reduced before it conversion in the Encapsulated PostScript
format by a screen dump utility. In this case, usage of the manual mode is the
only alternative, at the price of the real multiple inclusion of the EPS file. We
must take care to specify the correct fillsize parameter, because otherwise the
default values are large and will load the file many times, perhaps just really using
few occurrences as the other ones would be clipped...

1 \psboxfill{\includegraphics{flowers}}
2 \begin{pspicture}(8,4)
3 \psellipse[fillstyle=boxfill,fillsize={(8,4)}](4,2)(4,2)
4 \end{pspicture}

15
14
13
12
11
9
8
7
6
5
4
3
2
1
10
9
8
7
6
5
4
3
2
1

3.4
3.3

10 ^^A
1 da S 1
18 82 d day ys... Si ince 1 82
s
18 2 d ay ... Si ce 1 82 n
2 ay s.. S nc 1 82
d s . in e 8 d
da ays. ... S Sin ce 182 2 d ays
y

\psboxfill{%
d s .. in ce 18 d ay ...
da ays. ... S Sin ce 182 2 d ays s...

\centerline{%

\end{pspicture}
ys .. in ce 18 d ay ...

\end{pspicture*}
... Sin ce 18 2 d ay s.. Si
S c 1 2 a s. . S n
effects like these ones:

Si ince e 1 82 day ys.. .. S inc ce

\psscalebox{-1 1}{%
Si nce 1 82 day s.. . S inc e

\rput(1.235,4.8){%

\begin{pspicture}(8,2)
nc 1 82 da s . S in e

\begin{pspicture*}(8,4)
e 82 d ys ... in ce 18
1 a . S c 1 2
18 82 d day ys... .. Si ince e 1 82
18 2 d ay s... Si nce 1 82
2 ay s.. S nc 1 82 da
d s . in e 8 d y
Tiling of characters

% A kangaroo of kangaroos...
d ays ... Sin ce 18 2 d ay s...

Other kinds of usage


da ays. ... S Sin ce 182 2 d ays s...

\psset{unit=0.1,linewidth=0.2pt}
ys .. in ce 18 d ay ...
... Sin ce 18 2 d ay s.. Si
\psboxfill{\smallrm Since 182 days...} S c 1 2 a s. . S n

16
Si ince e 1 82 day ys.. .. S inc ce
n
Si ce 1 82 day s.. . S inc e

fillangle=45,fillsep=0.7mm]
nc 1 82 da s . S in e

\Kangaroo{PeachPuff}\Kangaroo{PaleGreen}%
e 82 d ys ... in ce
1 a . S c 1

{\rput[b](0,0.1){\bigsf 2000}}}
18 82 d day ys... .. Si ince e 1 82

{\rput[b](4,0){\mediumrm Kangaroo}}
\DeclareFixedFont{\smallrm}{T1}{ptm}{m}{n}{3mm}
\DeclareFixedFont{\bigsf}{T1}{phv}{b}{n}{4.5cm}

\Kangaroo{LightBlue}\Kangaroo{LemonChiffon}%
18 2 d ay s... Si nce 1 82

\DeclareFixedFont{\mediumrm}{T1}{ptm}{m}{n}{2cm}
\pscharpath[fillstyle=gradient,gradangle=-45,

2 ay s.. S nc 1 82 da

\Kangaroo{LemonChiffon}\Kangaroo{LightBlue}%
d s . in e 8 d y

\Kangaroo{PaleGreen}\Kangaroo{PeachPuff}}}}
da ays. ... S Sin ce 182 2 d ays s...
gradmidpoint=0.5,addfillstyle=boxfill,

da ys. .. S in ce 182 d ays ...


da ys. .. S in ce 182 d ays ...
ys .. in ce 18 d ay ...
... Sin ce 18 2 d ay s.. Si
S c 1 2 a s. . S n
S inc e 1 82 da ys. .. S in ce

\pscharpath[linestyle=none,fillstyle=boxfill,fillloopadd=1]
Si ince e 1 82 day ys.. .. S inc ce
nc 1 82 da s . S in e
e 82 d ys ... in ce 18
1 a . S c 1 2
18 82 d day ys... .. Si ince e 1 82
2 ay s.. S nc 1 82 da
da s. . S in e 82 d ys
ys .. in ce 18 d ay ...
... Sin ce 18 2 d ay s..
ce 2 ay s.. .
s .. .
.
We can also use the \psboxfill macro to fill the interior of characters for special

Other kinds of usage can be imagined. For instance, we can use tilings in a sort of
degenerated way to draw some special lines made by a unique or multiple repeating
patterns. But it can be only a special dashed line, as here with three different
dashes:

1 \newcommand{\Dashes}{%
2 \psset{dimen=middle}
3 \begin{pspicture}(0,-0.5\pslinewidth)(1,0.5\pslinewidth)
4 \rput(0,0){\psline(0.4,0)}%
5 \rput(0.5,0){\psline(0.2,0)}%
6 \rput(0.8,0){\psline(0.1,0)}
7 \end{pspicture}}
8
9 \newcommand{\SpecialDashedLine}[3]{%
10 \psboxfill{#3}
11 \Tiling[linestyle=none]
12 {(#1,-0.5\pslinewidth)(#2,0.5\pslinewidth)}}
13
14 \SpecialDashedLine{0}{7}{\Dashes}
15
16 \psset{unit=0.5,linewidth=1mm,linecolor=red}
17 \SpecialDashedLine{0}{10}{\Dashes}

It allow also to use special patterns in business graphics, as in the following


example generated by PstChart5.

4 “Dynamic” tilings
In some cases, tilings used non static tiles, that is to say that the prototile(s),
even if unique, can have several forms, by instance specified by different colors or
rotations, not fixed before generation or varying each time.

4.1 Lewthwaite-Pickover-Truchet tiling


We give here for example the so-called Truchet tiling, which much be in fact better
called Lewthwaite-Pickover-Truchet (LPT) tiling 6 .
The unique prototile is only a square with two opposite circle arcs. This tile
has obviously two positions, if we rotate it from 90 degrees (see the two tiles on
the next figure). A LPT tiling is a tiling with randomly oriented LPT tiles. We
can see that even if it is very simple in it principle, it draw sophisticated curves
with strange properties.
Nevertheless, in the straightforward way ‘pst-fill’ does not work, because the
\psboxfill macro store the content of the tile used in a TEX box, which is static.
So the calling to the random function is done only one time, which explain that
only one rotation of the tile is used for all the tiling. It’s only the one of the two
rotations which could differ from one drawing to the next one...
5A personal development to draw business charts with PSTricks, not distributed.
6 Fordescription of the context, history and references about Sébastien Truchet and this
tiling, see (5).

17
Fantaisist repartition of kangaroos
in the world (in thousands)
2000

1500

1000

500

0
Oceania Africa Asia America Europe

Figure 1: Bar chart generated by PstChart, with bars filled by patterns

18
1 ^^A % LPT prototile
2 \newcommand{\ProtoTileLPT}{%
3 \psset{dimen=middle}
4 \begin{pspicture}(1,1)
5 \psframe(1,1)
6 \psarc(0,0){0.5}{0}{90}
7 \psarc(1,1){0.5}{-180}{-90}
8 \end{pspicture}}
9
10 ^^A % LPT tile
11 \newcount\Boolean
12 \newcommand{\BasicTileLPT}{%
13 ^^A % From random.tex by Donald Arseneau
14 \setrannum{\Boolean}{0}{1}%
15 \ifnum\Boolean=0
16 \ProtoTileLPT%
17 \else
18 \psrotateleft{\ProtoTileLPT}%
19 \fi}
20
21 \ProtoTileLPT\hfill\psrotateleft{\ProtoTileLPT}\hfill
22 \psset{unit=0.5}
23 \psboxfill{\BasicTileLPT}
24 \Tiling{(5,5)}

But, for simple cases, there is a solution to this problem using a mix-
ture of PSTricks and PostScript programming. Here the PSTricks construc-
tion \pscustom{\code{...}} allow to insert PostScript code inside the LATEX
+ PSTricks one.
Programmation is less straightforward, but it has also the advantage to be
notably faster, as all the tilings operations are done in PostScript, and mainly to
not be limited by TEX memory (the TEX + PSTricks solution I wrote in 1995 for
the colored problem was limited to small sizes for this reason). Just note also
that \pslbrace and \psrbrace are two PSTricks macros to define and be able to
insert the { and } characters.

19
1 ^^A % LPT prototile
2 \newcommand{\ProtoTileLPT}{%
3 \psset{dimen=middle}
4 \psframe(1,1)
5 \psarc(0,0){0.5}{0}{90}
6 \psarc(1,1){0.5}{-180}{-90}}
7
8 ^^A % Counter to change the random seed
9 \newcount\InitCounter
10 ^^A % LPT tile
11 \newcommand{\BasicTileLPT}{%
12 \InitCounter=\the\time
13 \pscustom{\code{%
14 rand \the\InitCounter\space sub 2 mod 0 eq \pslbrace}}
15 \begin{pspicture}(1,1)
16 \ProtoTileLPT
17 \end{pspicture}%
18 \pscustom{\code{\psrbrace \pslbrace}}
19 \psrotateleft{\ProtoTileLPT}%
20 \pscustom{\code{\psrbrace ifelse}}}
21
22 \psset{unit=0.4,linewidth=0.4pt}
23 \psboxfill{\BasicTileLPT}
24 \Tiling{(15,15)}

Using the very surprising fact (see (5)) that coloration of these tiles do not
depend of their neighbors (even if it is difficult to believe as the opposite seems
obvious!) but only of the parity of the value of row and column positions, we can
directly program in the same way a colored version of the LPT tiling.
We have also introduce in the ‘pst-fill’ code for tiling mode two new accessible
PostScript variables, row and column2, which can be useful in some circonstances,
like this one.

20
1 ^^A % LPT prototile
2 \newcommand{\ProtoTileLPT}[2]{%
3 \psset{dimen=middle,linestyle=none,fillstyle=solid}
4 \psframe[fillcolor=#1](1,1)
5 \psset{fillcolor=#2}
6 \pswedge(0,0){0.5}{0}{90} \pswedge(1,1){0.5}{-180}{-90}}
7 ^^A % Counter to change the random seed
8 \newcount\InitCounter
9 ^^A % LPT tile
10 \newcommand{\BasicTileLPT}[2]{%
11 \InitCounter=\the\time
12 \pscustom{\code{%
13 rand \the\InitCounter\space sub 2 mod 0 eq \pslbrace
14 row column add 2 mod 0 eq \pslbrace}}
15 \begin{pspicture}(1,1)\ProtoTileLPT{#1}{#2}\end{pspicture}%
16 \pscustom{\code{\psrbrace \pslbrace}}
17 \ProtoTileLPT{#2}{#1}%
18 \pscustom{\code{%
19 \psrbrace ifelse \psrbrace \pslbrace row column add 2 mod 0 eq \pslbrace}}
20 \psrotateleft{\ProtoTileLPT{#2}{#1}}\pscustom{\code{\psrbrace \pslbrace}}
21 \psrotateleft{\ProtoTileLPT{#1}{#2}}\pscustom{\code{\psrbrace ifelse \
psrbrace ifelse}}}
22 \psboxfill{\BasicTileLPT{red}{yellow}}
23 \Tiling{(4,4)}\hfill
24 \psset{unit=0.4}\psboxfill{\BasicTileLPT{blue}{cyan}}
25 \Tiling{(15,15)}

Another classic example is to generate coordinates and numerotation for a


grid. Of course, it is possible to do it directly in PSTricks using nested \multido
commands. It would be clearly easy to program, but, nevertheless, for users who
have a little knowledge of PostScript programming, this offer an alternative which
is useful for large cases, because on this way it will be notably faster and less
computer ressources consuming.
Remember here that the tiling is drawn from left to right, and top to bottom,
and note that the PostScript variable x2 give the total number of columns.

21
(1,1) (1,2) (1,3) (1,4) (1,5) (1,6)
1 2 3 4 5 6
(2,1) (2,2) (2,3) (2,4) (2,5) (2,6)
7 8 9 10 11 12
(3,1) (3,2) (3,3) (3,4) (3,5) (3,6)
13 14 15 16 17 18
(4,1) (4,2) (4,3) (4,4) (4,5) (4,6)
19 20 21 22 23 24
1 ^^A % \Escape will be the \ character
2 {\catcode‘\!=0\catcode‘\\=11!gdef!Escape{\}}
3 \newcommand{\ProtoTile}{%
4 \Square\pscustom{%
5 \moveto(-0.9,0.75) % In PSTricks units
6 \code{ /Times-Italic findfont 8 scalefont setfont
7 (\Escape() show row 3 string cvs show (,) show
8 column 3 string cvs show (\Escape)) show}
9 \moveto(-0.5,0.25) % In PSTricks units
10 \code{ /Times-Bold findfont 18 scalefont setfont
11 1 0 0 setrgbcolor % Red color
12 /center {dup stringwidth pop 2 div neg 0 rmoveto} def
13 row 1 sub x2 mul column add 3 string cvs center show}}}
14 \psboxfill{\ProtoTile}
15 \Tiling{(6,4)}

4.2 A complete example: the Poisson equation


To finish, we will show a complete real example, a drawing to explain the method
used to solve the Poisson equation by a domain decomposition method, adapted
to distributed memory computers. The objective is to show the communications
required between processes and the position of the data to exchange. This code
also show some useful and powerful technics for PSTricks programming (look spe-
cially at the way some higher level macros are defined, and how the same object
is used to draw the four neighbors).

22
rs rs rs rs rs rs rs rs rs rs
rs rs rs rs rs rs rs rs rs rs
rs rs rs rs rs rs rs rs rs rs
rs rs rs rs rs Nrs rs rs rs rs
rs rs rs rs rs rs rs rs rs rs

+ rs + rs + rs + rs + rs + rs + rs + rs + rs + rsut ut ut ut ut ut ut ut ut
+ rs + rs + rs + rs + rs + rs + rs + rs + rs + rs
+ rs + rs + rs + rs + rs + rs + rs + rs + rs + rsut + ut + ut + ut + ut ut ut ut ut
bc bc bc bc bc bc bc
+ rs bc bc + bc rs bc bc+ rs bc + rs bc + rs + rs + rs ut + rs ut + rs ut + rsut ut
+ ut + ut ut + ut + ut ut ut ut ut
bc bc bc bc + bc + bc bc + + rs bc bc + bc rs bc + bc+ rs bc + rs bc + rs + rs + rs ut + rs ut + rs ut ++ rsut ut
+ut ut + ut ut
ut
+ ut + ut ut ut ut ut
bc bc bc bc + bc + bcbc bc + + rs bc bc + + bc rs bc + bc+ rs bc + rs bc + rs + rs + rs ut + rs ut + rs ut + rsut
bc bc bc bc + bc + bc bc + + rs bc bc + + bc rs bc + bc+ rs bc + rs bc + rs + rs + rs ut + rs ut + rs ut ++ rs ut + ut + ut ut + ut + ut ut ut ut ut

+ bc + bc + bc + bc + + + ut + ut + ut + ut ut + ut + ut ut + ut + ut ut ut ut ut
bc bc bc bc + bc + bc bc + + bc bc + + bc bc + bc+ bc + bc + + + ut + ut + ut + ut ut
+ ut + ut ut + ut + ut ut ut ut ut
W + bc + bc bc + + bc bc + bc bc + bc+ bc + bc + + + ut + ut + ut ++ ut + ut + ut ut E ut
bc bc bc bc ut ut
+ ut + ut ut ut ut
bc bc bc bc + bc + bcbc bc + + bc bc + bc bc + bc+ bc + bc + + + ut + ut + ut ++ ut ut
ut + ut + ut ut + ut + ut ut ut ut ut
bc bc bc bc + bc + bc bc + + bc bc + + bc bc + bc+ bc + bc + + + ut + ut + ut +
+ bc + ×bc + ×bc + ×bc + × + × + × ut + × ut + × ut ++ ut ut + ut + ut ut + ut + ut ut ut ut ut
bc bc bc bc + bc + bc bc + + bc bc + + ×bc bc ++ bc+ ×bc + + ×bc + + × + + × + + × + ut + × + ut + × + ut + + ut + + ut + +
bc bc bc bc + bc + bc bc + + bc bc + ×bc bc + bc+ ×bc + + ×bc + + × + + × + + × + ut + × + ut + × + ut + + ut + ut
+ + + + +× +× +× +× +× +× +× + + +
+× +× +× +× +× +× +× + + +
+× +× +× +× +× +× +× + + +
× × × × × × ×
× × × × × × ×
S
1 \ newcomman d {\ Pattern }[1]{ %
2 \ begin { pspicture }( -0.25 , -0.25) (0.25 ,0.25) \ rput {*0}{\ psdot [
dotstyle =#1]}
3 \ end { pspicture }}
4 \ newcomman d {\ West }{\ Pattern { o }} \ newcomman d {\ South }{\ Pattern { x
}}
5 \ newcomman d {\ Central }{\ Pattern {+}}\ newcomman d {\ North }{\ Pattern {
square }}
6 \ newcomman d {\ East }{\ Pattern { triangle }}
7 \ newcomman d {\ Cross }{ %
8 \ pspolygon [ unit =0.5 , linewidth =0.2 , linecolor = red ](0 ,0) (0 ,1) (1 ,1)
(1 ,2) (2 ,2) (2 ,1)
9 (3 ,1) (3 ,0) (2 ,0) (2 , -1) (1 , -1) (1 ,0) }
10 \ newcomman d {\ S t y l e P o s i t i o n }[1]{\ LARGE \ textcolor { red }{\ textbf
{#1}}}
11 \ newcomman d {\ SubDomain }[4]{ %
12 \ psboxfill {#4}
13 \ begin { psclip }{\ psframe [ linestyle = none ]#1}
14 \ psframe [ linestyle =#3](5 ,5) \ psframe [ fillstyle = boxfill ]#2
15 \ end { psclip }}
16 \ newcomman d {\ SendArea }[1]{\ psframe [ fillstyle = solid , fillcolor = cyan
]#1}
17 \ newcomman d {\ ReceiveD a ta }[2]{ %

23
18 \ psboxfill {#2}
19 \ psframe [ fillstyle = solid , fillcolor = yellow , a d d f i l l s t y l e = boxfill
]#1}
20 \ newcomman d {\ Neighbor }[2]{ %
21 \ begin { pspicture }(5 ,5)
22 \ rput {*0}(2.5 ,2.5) {\ S t y l e P o s i t i o n {#1}}
23 \ ReceiveDa t a {(0.5 ,0) (4.5 ,0.5) }{\ Central }\ SendArea {(0.5 ,0.5)
(4.5 ,1) }
24 \ SubDomain {(5 ,2) }{(0.5 ,0.5) (4.5 ,3) }{ dashed }{#2} %
25 ^^ A % R e c e i v e and send arrows
26 \ pcarc [ arcangle =45 , arrows = - >](0.5 , -1.25) (0.5 ,0.25)
27 \ pcarc [ arcangle =45 , arrows = - > , linestyle = dotted , dotsep =2 pt
](4.5 ,0.75) (4.5 , -0.75)
28 \ end { pspicture }}
29 \ psset { dimen = middle , dotscale =2 , fillloopa d d =2}
30 \ begin { pspicture }( -5.7 , -5.7) (5.7 ,5.7)
31 ^^ A % C e n t r a l domain
32 \ rput (0 ,0) { %
33 \ begin { pspicture }(5 ,5)
34 ^^ A % R e c e i v e from West , East , North and South
35 \ ReceiveD a ta {(0 ,0.5) (0.5 ,4.5) }{\ West } \ ReceiveD a ta
{(4.5 ,0.5) (5 ,4.5) }{\ East }
36 \ ReceiveD a ta {(0.5 ,4.5) (4.5 ,5) }{\ North }\ ReceiveD a ta {(0.5 ,0)
(4.5 ,0.5) }{\ South }
37 ^^ A % send area for West , East , North and South
38 \ SendArea {(0.5 ,0.5) (1 ,4.5) } \ SendArea {(4 ,0.5) (4.5 ,4.5) }
39 \ SendArea {(0.5 ,0.5) (4.5 ,1) } \ SendArea {(0.5 ,4) (4.5 ,4.5) }
40 ^^ A % C e n t r a l domain
41 \ SubDomain {(5 ,5) }{(0.5 ,0.5) (4.5 ,4.5) }{ solid }{\ Central }
42 ^^ A % Redraw o v e r l a p p e d linesY
43 \ psline (1 ,0.5) (1 ,4.5) \ psline (4 ,0.5) (4 ,4.5)
44 ^^ A % Two c r o s s e s Y
45 \ rput (1.5 ,4) {\ Cross } \ rput (2 ,2) {\ Cross }
46 \ end { pspicture }}
47 ^^ A % The four n e i g h b o r s Y
48 \ rput (0 ,5.5) {\ Neighbor { N }{\ North }} \ rput { -90}(5.5 ,0) {\
Neighbor { E }{\ East }}
49 \ rput {90}( -5.5 ,0) {\ Neighbor { W }{\ West }} \ rput {180}(0 , -5.5) {\
Neighbor { S }{\ South }}
50 \ end { pspicture }

Bibliography

References
[1] Adobe, Systems Incorporated, PostScript Language Reference Manual,
Addison-Wesley, 2 edition, 1995.
[2] Piotr Bolek, METAPOST and patterns, TUGboat, Volume 19, Number 3,
pages 276–283, September 1998, graphics/metapost/macros/mpattern.
[3] Emmanuel Chailloux, Guy Cousineau and Ascánder Suárez, Programmation
fonctionnelle de graphismes pour la production d’illustrations techniques,
Technique et science informatique, Volume 15, Number 7, pages 977–1007,
1996 (in french).

24
[4] André Deledicq, Le monde des pavages, ACL Éditions, 1997 (in french).
[5] Philippe Esperet and Denis Girou, Coloriage du pavage dit de Truchet,
Cahiers GUTenberg, Number 31, pages 5–18, December 1998 (in french).
[6] Denis Girou, Présentation de PSTricks, Cahiers GUTenberg, Number 16,
pages 21–70, February 1994 (in french).
[7] Michel Goossens, Sebastian Rahtz and Frank Mittelbach, The LATEX Graphics
Companion, Addison-Wesley, 2005.
[8] Branko Grünbaum and Geoffrey Shephard, Tilings and Patterns, Freeman
and Company, 1987.
[9] Alan Hoenig, TEX Unbound: LATEX & TEX Strategies, Fonts, Graphics, and
More, Oxford University Press, 1997.
[10] Kristoffer H. Rose and Ross Moore, XY-pic. Pattern and Tile extension, avail-
able from CTAN, 1991-1998, macros/generic/diagrams/xypic.
[11] Kees van der Laan, Paradigms: Just a little bit of PostScript, MAPS, Vol-
ume 17, pages 137–150, 1996.
[12] Kees van der Laan, Tiling in PostScript and METAFONT – Escher’s wink,
MAPS, Volume 19, Number 2, pages 39–67, 1997.
[13] Timothy Van Zandt, PSTricks. PostScript macros for Generic TEX, available
from CTAN, 1993, graphics/pstricks.
[14] Timothy Van Zandt and Denis Girou, Inside PSTricks, TUGboat, Volume 15,
Number 3, pages 239–246, September 1994.
[15] Herbert Voß, PSTricks – Graphics for TEX and LATEX, DANTE/Lehmanns,
4th ed., 2007.
[16] Hao Wang, Games, Logic and Computers, Scientific American, pages 98–106,
November 1965.

5 Driver file
The next bit of code contains the documentation driver file for TEX, i.e., the file
that will produce the documentation you are currently reading. It will be extracted
from this file by the docstrip program.
1 h∗driveri
2 \documentclass{ltxdoc}
3 \GetFileInfo{pst-fill.dtx}
4%
5 \usepackage[T1]{fontenc}
6 \usepackage{lmodern} % For PDF

25
7 \usepackage{graphicx} % ‘graphicx’ LaTeX standard package
8 \usepackage{showexpl}
9 \usepackage{mflogo} % For the MetaFont and MetaPost logos
10 \input{random.tex} % Random macros from Donald Arseneau
11 \usepackage{url} % URLs convenient typesetting
12 \usepackage{multido} % General loop macro
13 \usepackage[dvipsnames]{pstricks} % PSTricks with the ‘color’ extension
14 \usepackage{pst-text} % PSTricks package for character path
15 \usepackage{pst-grad} % PSTricks package for gradient filling
16 \usepackage{pst-node} % PSTricks package for nodes
17 \usepackage[tiling]{pst-fill} % PSTricks package for filling/tiling
18 %
19 \AtBeginDocument{%
20 % \OnlyDescription % comment out for implementation details
21 \EnableCrossrefs
22 \CodelineIndex
23 \RecordChanges}
24 \AtEndDocument{%
25 \PrintIndex
26 \setcounter{IndexColumns}{1}
27 \PrintChanges}
28 \hbadness=7000 % Over and under full box warnings
29 \hfuzz=3pt
30 \begin{document}
31 \DocInput{pst-fill.dtx}
32 \end{document}
33 h/driveri

6 pst-fill LATEX wrapper


34 h∗latex − wrapperi
35 \RequirePackage{pstricks}
36 \ProvidesPackage{pst-fill}[2005/09/13 package wrapper for
37 pst-fill.tex (hv)]
38 \DeclareOption{tiling}{\def\PstTiling{true}}
39 \ProcessOptions\relax
40 \input{pst-fill.tex}
41 \ProvidesFile{pst-fill.tex}
42 [\filedate\space v\fileversion\space ‘PST-fill’ (tvz,dg)]
43 h/latex − wrapperi

7 Pst-Fill Package code


44 h∗pst − filli

7.1 Preamble
Who we are.
45 \def\fileversion{1.01}

26
46 \def\filedate{2007/03/10}
47 \message{‘PST-Fill’ v\fileversion, \filedate\space (tvz,dg,hv)}
48 \csname PSTboxfillLoaded\endcsname
49 \let\PSTboxfillLoaded\endinput

Require the main PSTricks package.


50 \ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi
interface to the extended ‘keyval’ package.
51 \ifx\PSTXKeyLoaded\endinput\else\input pst-xkey\fi
52 %
Catcodes changes and defining the family name for xkeyval.
53 \edef\PstAtCode{\the\catcode‘\@}\catcode‘\@=11\relax
54
55 \pst@addfams{pst-fill}
56 %

7.2 The size of the box


pst@@boxfillsize
57 %
58 \def\pst@@boxfillsize#1(#2,#3)#4(#5,#6)#7(#8\@nil{%
59 \begingroup
60 \ifx\@empty#7\relax
61 \pst@dima\z@
62 \pst@dimb\z@
63 \pssetxlength\pst@dimc{#2}%
64 \pssetylength\pst@dimd{#3}%
65 \else
66 \pssetxlength\pst@dima{#2}%
67 \pssetylength\pst@dimb{#3}%
68 \pssetxlength\pst@dimc{#5}%
69 \pssetylength\pst@dimd{#6}%
70 \fi
71 \xdef\pst@tempg{%
72 \pst@dima=\number\pst@dima sp
73 \pst@dimb=\number\pst@dimb sp
74 \pst@dimc=\number\pst@dimc sp
75 \pst@dimd=\number\pst@dimd sp }%
76 \endgroup
77 \let\psk@boxfillsize\pst@tempg}

7.3 Definition of the parameters


78 \define@key[psset]{pst-fill}{boxfillsize}{%
79 \def\pst@tempg{#1}\def\pst@temph{auto}%
80 \ifx\pst@tempg\pst@temph
81 \let\psk@boxfillsize\relax

27
82 \else
83 \pst@@boxfillsize#1(\z@,\z@)\@empty(\z@,\z@)(\@nil
84 \fi}
85 \psset{boxfillsize={(-15cm,-15cm)(15cm,15cm)}}
86 \define@key[psset]{pst-fill}{boxfillcolor}{\pst@getcolor{#1}\psboxfillcolor}
87 \psset{boxfillcolor=black}% hv
88 \define@key[psset]{pst-fill}{boxfillangle}{\pst@getangle{#1}\psk@boxfillangle}
89 \psset{boxfillangle=0}
90 \define@key[psset]{pst-fill}{fillsepx}{%
91 \pst@getlength{#1}\psk@fillsepx}
92 \define@key[psset]{pst-fill}{fillsepy}{%
93 \pst@getlength{#1}\psk@fillsepy}
94 \define@key[psset]{pst-fill}{fillsep}{%
95 \pst@getlength{#1}\psk@fillsepx%
96 \let\psk@fillsepy\psk@fillsepx}
97 \psset{fillsep=2pt}
98
99 \ifx\PstTiling\@undefined
100 \define@key[psset]{pst-fill}{fillcycle}{\pst@getint{#1}\psk@fillcycle}
101 \psset{fillcycle=0}
102 \else
103 \define@key[psset]{pst-fill}{fillangle}{\pst@getangle{#1}\psk@boxfillangle}
104 \define@key[psset]{pst-fill}{fillsize}{%
105 \def\pst@tempg{#1}\def\pst@temph{auto}%
106 \ifx\pst@tempg\pst@temph\let\psk@boxfillsize\relax
107 \else\pst@@boxfillsize#1(\z@,\z@)\@empty(\z@,\z@)(\@nil\fi}
108 \psset{fillsep=0,fillsize=auto}
109 \define@key[psset]{pst-fill}{fillcyclex}{\pst@getint{#1}\psk@fillcyclex}
110 \define@key[psset]{pst-fill}{fillcycley}{\pst@getint{#1}\psk@fillcycley}
111 \define@key[psset]{pst-fill}{fillcycle}{%
112 \pst@getint{#1}\psk@fillcyclex\let\psk@fillcycley\psk@fillcyclex}
113 \psset{fillcycle=0}
114 \define@key[psset]{pst-fill}{fillmovex}{\pst@getlength{#1}\psk@fillmovex}
115 \define@key[psset]{pst-fill}{fillmovey}{\pst@getlength{#1}\psk@fillmovey}
116 \define@key[psset]{pst-fill}{fillmove}{%
117 \pst@getlength{#1}\psk@fillmovex\let\psk@fillmovey\psk@fillmovex}
118 \psset{fillmove=0pt}
119 \define@key[psset]{pst-fill}{fillloopaddx}{\pst@getint{#1}\psk@fillloopaddx}
120 \define@key[psset]{pst-fill}{fillloopaddy}{\pst@getint{#1}\psk@fillloopaddy}
121 \define@key[psset]{pst-fill}{fillloopadd}{%
122 \pst@getint{#1}\psk@fillloopaddx\let\psk@fillloopaddy\psk@fillloopaddx}
123 \psset{fillloopadd=0}
124 % For debugging (to debug, set PstDebug=1)
125 % we now use the one from pstricks to prevent a clash with package
126 % pstricks 2004-06-22
127 %% \define@key[psset]{pst-fill}{PstDebug}{\pst@getint{#1}\psk@PstDebug}
128 \psset{PstDebug=0}
129 \fi
130 % DG addition end

28
7.4 Definition of the fill box
psboxfill
131 \newbox\pst@fillbox
132 \def\psboxfill{\pst@killglue\pst@makebox\psboxfill@i}
133 \def\psboxfill@i{\setbox\pst@fillbox\box\pst@hbox\ignorespaces}

7.5 The main macros


psfs@boxfill
134 \def\psfs@boxfill{%
135 \ifvoid\pst@fillbox
136 \@pstrickserr{Fill box is empty. Use \string\psboxfill\space first.}\@ehpa
137 \else
138 \ifx\psk@boxfillsize\relax \pst@AutoBoxFill
139 \else\pst@ManualBoxFill\fi
140 \fi}

pst@ManualBoxFill
141 \def\pst@ManualBoxFill{%
142 \leavevmode
143 \begingroup
144 \pst@FlushCode
145 \begin@psclip
146 \pstVerb{clip}%
147 \expandafter\pst@AddFillBox\psk@boxfillsize
148 \end@psclip
149 \endgroup}

pst@FlushCode
150 \def\pst@FlushCode{%
151 \pst@Verb{%
152 /mtrxc CM def
153 CP CP T
154 \tx@STV
155 \psk@origin
156 \psk@swapaxes
157 \pst@newpath
158 \pst@code
159 mtrxc setmatrix
160 moveto
161 0 setgray}%
162 \gdef\pst@code{}}

pst@AddFillBox
163 \def\pst@AddFillBox#1 #2 #3 #4 {%
164 \begingroup
165 \setbox\pst@fillbox=\vbox{%
166 \hbox{\unhcopy\pst@fillbox\kern\psk@fillsepx\p@}%

29
167 \vskip\psk@fillsepy\p@}%
168 \psk@boxfillsize
169 \pst@cnta=\pst@dimc
170 \advance\pst@cnta-\pst@dima
171 \divide\pst@cnta\wd\pst@fillbox
172 \pst@cntb=\pst@dimd
173 \advance\pst@cntb-\pst@dimb
174 \pst@dimd=\ht\pst@fillbox
175 \divide\pst@cntb\pst@dimd
176 \def\pst@tempa{%
177 \pst@tempg
178 \copy\pst@fillbox
179 \advance\pst@cntc\@ne
180 \ifnum\pst@cntc<\pst@cntd\expandafter\pst@tempa\fi}%
181 \let\pst@tempg\relax
182 \pst@cntc-\tw@
183 \pst@cntd\pst@cnta
184 \setbox\pst@fillbox=\hbox to \z@{%
185 \kern\pst@dima
186 \kern-\wd\pst@fillbox
187 \pst@tempa
188 \hss}%
189 \pst@cntd\pst@cntb
190 %% DG modification begin - Dec. 11, 1997 - Patch 2
191 \ifx\PstTiling\@undefined
192 \ifnum\psk@fillcycle=\z@\pst@ManualFillCycle\fi
193 \else
194 \ifnum\psk@fillcyclex=\z@\pst@ManualFillCycle\fi
195 \fi
196 %% DG modification end
197 \global\setbox\pst@boxg=\vbox to\z@{%
198 \offinterlineskip
199 \vss
200 \pst@tempa
201 \vskip\pst@dimb}%
202 \endgroup
203 \setbox\pst@fillbox\box\pst@boxg
204 \pst@rotate\psk@boxfillangle\pst@fillbox
205 \box\pst@fillbox}

pst@ManualFillCycle
206 \def\pst@ManualFillCycle{%
207 \ifx\PstTiling\@undefined
208 \pst@cntg=\psk@fillcycle
209 \else
210 \pst@cntg=\psk@fillcyclex
211 \fi
212 \pst@dimg=\wd\pst@fillbox
213 \ifnum\pst@cntg=\z@
214 \else

30
215 \divide\pst@dimg\pst@cntg
216 \fi
217 \ifnum\pst@cntg<\z@\pst@cntg=-\pst@cntg\fi
218 \advance\pst@cntg\m@ne
219 \pst@cnth=\pst@cntg
220 \def\pst@tempg{%
221 \ifnum\pst@cnth<\pst@cntg\advance\pst@cnth\@ne\else\pst@cnth\z@\fi
222 \moveright\pst@cnth\pst@dimg}}

Auto box fill: !! Fix dictionary

7.6 The PostScript subroutines


223 %% DG addition begin - Apr. 8, 1997 and Dec. 1997 - Patch 2
224 \ifx\PstTiling\@undefined
225 \pst@def{AutoFillCycle}<%
226 /c ED
227 /n 0 def
228 /s {
229 /x x w c div n mul add def
230 /n n c abs 1 sub lt { n 1 add } { 0 } ifelse def
231 } def>
232
233 \pst@def{BoxFill}<%
234 gsave
235 gsave \tx@STV CM grestore dtransform CM idtransform
236 abs /h ED abs /w ED
237 pathbbox
238 h div round 2 add cvi /y2 ED
239 w div round 2 add cvi /x2 ED
240 h div round 2 sub cvi /y1 ED
241 w div round 2 sub cvi /x1 ED
242 /y2 y2 y1 sub def
243 /x2 x2 x1 sub def
244 CP
245 y1 h mul sub neg /y1 ED
246 x1 w mul sub neg /x1 ED
247 clip
248 y2 {
249 /x x1 def
250 s
251 x2 {
252 save CP x y1
253 %% patch 4 hv --------------
254 \ifx\VTeXversion\undefined
255 \else
256 %%============ mv: 09-10-01 ??? this is likely to be a right change
257 neg
258 %%============
259 \fi

31
260 %% end patch 4
261 T moveto Box restore
262 /x x w add def
263 } repeat
264 /y1 y1 h add def
265 } repeat
266 % Next line not useful... To see that, suppress clipping (DG)
267 CP x y1 T moveto Box
268 currentpoint currentfont grestore setfont moveto>
269 \else
270 %% DG modification begin - Apr. 8, 1997 and Nov. / Dec. 1997 - Patch 2
271 \pst@def{AutoFillCycleX}<%
272 /cX ED
273 /nX 0 def
274 /CycleX {
275 /x x w cX div nX mul add def
276 /nX nX cX abs 1 sub lt { nX 1 add } { 0 } ifelse def
277 } def>
278 \pst@def{AutoFillCycleY}<%
279 /cY ED
280 /mY 0 def
281 /nY 0 def
282 /CycleY {
283 /y1 y1 h cY div mY mul sub def
284 nY cY abs 1 sub lt { /nY nY 1 add def /mY 1 def }
285 { /nY 0 def /mY cY abs 1 sub neg def } ifelse
286 } def>
287
288 \pst@def{BoxFill}<%
289 gsave
290 gsave \tx@STV CM grestore dtransform CM idtransform
291 abs /h ED abs /w ED
292 pathbbox
293 h div round 2 add cvi /y2 ED
294 w div round 2 add cvi /x2 ED
295 h div round 2 sub cvi /y1 ED
296 w div round 2 sub cvi /x1 ED
297 /CoefLoopX 0 def
298 /CoefLoopY 0 def
299 /CoefMoveX 0 def
300 /CoefMoveY 0 def
301 \psk@boxfillangle\space 0 ne {/CoefLoopX 8 def /CoefLoopY 8 def} if
302 \psk@fillcyclex\space 0 ne {/CoefLoopX CoefLoopX 1 add def} if
303 \psk@fillcycley\space 0 ne {/CoefLoopY CoefLoopY 1 add def} if
304 \psk@fillmovex\space 0 ne
305 {/CoefLoopX CoefLoopX 2 add def
306 \psk@fillmovex\space 0 gt {/CoefMoveX CoefLoopX def}
307 {/CoefMoveX CoefLoopX neg def} ifelse} if
308 \psk@fillmovey\space 0 ne
309 {/CoefLoopY CoefLoopY 2 add def

32
310 \psk@fillmovey\space 0 gt {/CoefMoveY CoefLoopY def}
311 {/CoefMoveY CoefLoopY neg def} ifelse} if
312 \psk@fillsepx\space 0 ne {/CoefLoopX CoefLoopX 1 add def} if
313 \psk@fillsepy\space 0 ne {/CoefLoopY CoefLoopY 1 add def} if
314 /CoefLoopX CoefLoopX \psk@fillloopaddx\space add def
315 /CoefLoopY CoefLoopY \psk@fillloopaddy\space add def
316 /x2 x2 x1 sub 4 sub CoefLoopX 2 mul add def
317 /y2 y2 y1 sub 4 sub CoefLoopY 2 mul add def
318 %% We must fix the origin of tiling, as it must not vary according other stuff
319 %% in the page!
320 w x1 CoefLoopX add CoefMoveX add mul
321 h y1 y2 add 1 sub CoefLoopY sub CoefMoveY sub mul moveto
322 CP
323 y1 h mul sub neg /y1 ED
324 x1 w mul sub neg /x1 ED
325 %% hv 2004-06-22 to prevent clash with pst-gr3d
326 %% \psk@PstDebug 0 eq {clip} if
327 \Pst@Debug 0 eq {clip} if
328 %% end hv
329 \psk@fillmovex\space \psk@fillmovey
330 gsave \tx@STV CM grestore dtransform CM idtransform
331 /hmove ED /wmove ED
332 /row 0 def
333 y2 {
334 /row row 1 add def
335 /column 0 def
336 /x x1 def
337 CycleX
338 save
339 x2 {
340 /column column 1 add def
341 CycleY
342 save CP x y1
343 %% patch 4 hv --------------
344 \ifx\VTeXversion\undefined
345 \else
346 %%============ mv: 09-10-01 ??? this is likely to be a right change
347 neg
348 %%============
349 \fi
350 T moveto Box restore
351 /x x w add def
352 0 hmove translate
353 } repeat
354 restore
355 /y1 y1 h add def
356 wmove 0 translate
357 } repeat
358 currentpoint currentfont grestore setfont moveto>
359 \fi

33
360 \def\pst@AutoBoxFill{%
361 \leavevmode
362 \begingroup
363 \pst@stroke
364 \pst@FlushCode
365 \pst@Verb{\psk@boxfillangle\space \tx@RotBegin}%
366 \pstVerb{\pst@dict /Box \pslbrace end}%
367 \ifx\PstTiling\@undefined
368 \else
369 \ifx\pst@tempa\@undefined % Undefined for instance for \pscharpath
370 \else\ifx\pst@tempa\@empty\else
371 \def\pst@temph{0}%
372 \ifx\pst@tempa\pst@temph
373 \else
374 \pstVerb{/TR {pop pop currentpoint translate \pst@tempa\space translate } def}%
375 \fi
376 \fi\fi
377 \fi
378 \hbox to \z@{\vbox to\z@{\vss\copy\pst@fillbox\vskip-\dp\pst@fillbox}\hss}%
379 \ifx\PstTiling\@undefined
380 \pstVerb{%
381 tx@Dict begin \psrbrace def
382 \ifnum\psk@fillcycle=\z@
383 /s {} def
384 \else
385 \psk@fillcycle \tx@AutoFillCycle
386 \fi
387 \pst@number{\wd\pst@fillbox}%
388 \psk@fillsepx\space add
389 \pst@number{\ht\pst@fillbox}%
390 \pst@number{\dp\pst@fillbox}%
391 \psk@fillsepy\space add add
392 \tx@BoxFill
393 end}%
394 \else
395 \pstVerb{%
396 tx@Dict begin \psrbrace def
397 \ifnum\psk@fillcyclex=\z@
398 /CycleX {} def
399 \else
400 \psk@fillcyclex\space \tx@AutoFillCycleX
401 \fi
402 \ifnum\psk@fillcycley=\z@
403 /CycleY {} def
404 \else
405 \psk@fillcycley\space \tx@AutoFillCycleY
406 \fi
407 \pst@number{\wd\pst@fillbox}%
408 \psk@fillsepx\space add
409 \pst@number{\ht\pst@fillbox}%

34
410 \pst@number{\dp\pst@fillbox}%
411 \psk@fillsepy\space add add
412 \tx@BoxFill
413 end}%
414 \fi
415 \pst@Verb{\tx@RotEnd}%
416 \endgroup}

7.7 Closing
Catcodes restoration.
417 \catcode‘\@=\PstAtCode\relax
418 h/pst − filli

Index
Numbers written in italic refer to the page where the corresponding entry is de-
scribed; numbers underlined refer to the code line of the definition; numbers in
roman refer to the code lines where the entry is used.

Symbols O
\@empty . . . . . . . . . . . . 60, 83, 107, 370 \offinterlineskip . . . . . . . . . . . . 198
\@pstrickserr . . . . . . . . . . . . . . . . 136
\@undefined . . . . . . . . . . . . . . . . . . P
. . 99, 191, 207, 224, 367, 369, 379 \ProcessOptions . . . . . . . . . . . . . . 39
\psboxfill . . . . . . . . . . 131, 132, 136
B \psboxfill@i . . . . . . . . . . . . . 132, 133
\begin@psclip . . . . . . . . . . . . . . . . 145 \psboxfillcolor . . . . . . . . . . . . . . 86
\pscharpath . . . . . . . . . . . . . . . . . . 369
D \psfs@boxfill . . . . . . . . . . . . 134, 134
\DeclareOption . . . . . . . . . . . . . . . 38 \psk@boxfillangle 88, 103, 204, 301, 365
\psk@boxfillsize . . . . . . . . . . . . .
E . . . . . . 77, 81, 106, 138, 147, 168
\end@psclip . . . . . . . . . . . . . . . . . . 148
\psk@fillcycle 100, 192, 208, 382, 385
\psk@fillcyclex . . . . . . . . . . . . . .
G
. 109, 112, 194, 210, 302, 397, 400
\gdef . . . . . . . . . . . . . . . . . . . . . . . 162
\psk@fillcycley 110, 112, 303, 402, 405
I \psk@fillloopaddx . . . . 119, 122, 314
\ifvoid . . . . . . . . . . . . . . . . . . . . . 135 \psk@fillloopaddy . . . . 120, 122, 315
\ignorespaces . . . . . . . . . . . . . . . . 133 \psk@fillmovex 114, 117, 304, 306, 329
\psk@fillmovey 115, 117, 308, 310, 329
M \psk@fillsepx . . . . . . . . . . . . . . . .
\m@ne . . . . . . . . . . . . . . . . . . . . . . . 218 . . . . 91, 95, 96, 166, 312, 388, 408
\moveright . . . . . . . . . . . . . . . . . . 222 \psk@fillsepy 93, 96, 167, 313, 391, 411
\psk@origin . . . . . . . . . . . . . . . . . . 155
N \psk@PstDebug . . . . . . . . . . . . 127, 326
\newbox . . . . . . . . . . . . . . . . . . . . . 131 \psk@swapaxes . . . . . . . . . . . . . . . . 156
\number . . . . . . . . . . . . . . . . . . . 72–75 \pslbrace . . . . . . . . . . . . . . . . . . . 366

35
\psrbrace . . . . . . . . . . . . . . . 381, 396 \pst@number 387, 389, 390, 407, 409, 410
\pssetxlength . . . . . . . . . . . 63, 66, 68 \pst@rotate . . . . . . . . . . . . . . . . . . 204
\pssetylength . . . . . . . . . . . 64, 67, 69 \pst@stroke . . . . . . . . . . . . . . . . . . 363
\pst@@boxfillsize . . . 57, 58, 83, 107 \pst@tempa . . . . . . . . . . . . . . 176,
\pst@AddFillBox . . . . . . 147, 163, 163 180, 187, 200, 369, 370, 372, 374
\pst@AutoBoxFill . . . . . . . . . 138, 360 \pst@tempg . . . . . . . . . . . . . . . 71,
\pst@boxg . . . . . . . . . . . . . . . 197, 203 77, 79, 80, 105, 106, 177, 181, 220
\pst@cnta . . . . . . . . . . . . 169–171, 183 \pst@temph . . 79, 80, 105, 106, 371, 372
\pst@cntb . . . . . . . . 172, 173, 175, 189 \pst@Verb . . . . . . . . . . . 151, 365, 415
\pst@cntc . . . . . . . . . . . 179, 180, 182 \PSTboxfillLoaded . . . . . . . . . . . . 49
\pst@cntd . . . . . . . . . . . 180, 183, 189 \PstTiling 38, 99, 191, 207, 224, 367, 379
\pst@cntg . . . . . . . . . . . . . . . . . . . \pstVerb . . . . . 146, 366, 374, 380, 395
. 208, 210, 213, 215, 217–219, 221 \PSTXKeyLoaded . . . . . . . . . . . . . . . 51
\pst@cnth . . . . . . . . . . . 219, 221, 222
\pst@code . . . . . . . . . . . . . . . 158, 162 S
\Pst@Debug . . . . . . . . . . . . . . . . . . 327 \setbox . . . . . . 133, 165, 184, 197, 203
\pst@def . . . . . 225, 233, 271, 278, 288 \setcounter . . . . . . . . . . . . . . . . . . 26
\pst@dict . . . . . . . . . . . . . . . . . . . 366
\pst@dima . . . . . . . 61, 66, 72, 170, 185 T
\pst@dimb . . . . . . . 62, 67, 73, 173, 201 \tx@AutoFillCycle . . .......... 385
\pst@dimc . . . . . . . . . . 63, 68, 74, 169 \tx@AutoFillCycleX . . .......... 400
\pst@dimd . . . 64, 69, 75, 172, 174, 175 \tx@AutoFillCycleY . . .......... 405
\pst@dimg . . . . . . . . . . . 212, 215, 222 \tx@BoxFill . . . . . . . . . . . . . . 392, 412
\pst@fillbox . . . . . . . . . . . . . 131, \tx@RotBegin . . . . . . . .......... 365
133, 135, 165, 166, 171, 174, \tx@RotEnd . . . . . . . . .......... 415
178, 184, 186, 203–205, 212, \tx@STV . . . . . . . . . . 154, 235, 290, 330
378, 387, 389, 390, 407, 409, 410
\pst@FlushCode . . . . 144, 150, 150, 364 U
\pst@getangle . . . . . . . . . . . . . 88, 103 \undefined . . . . . . . . . . . . . . 254, 344
\pst@getcolor . . . . . . . . . . . . . . . . 86 \unhcopy . . . . . . . . . . . . . . . . . . . . 166
\pst@getint . . . . . . . . . . . . . . 100,
109, 110, 112, 119, 120, 122, 127 V
\pst@getlength 91, 93, 95, 114, 115, 117 \vbox . . . . . . . . . . .. . . . 165, 197, 378
\pst@hbox . . . . . . . . . . . . . . . . . . . 133 \vskip . . . . . . . . . .. . . . 167, 201, 378
\pst@killglue . . . . . . . . . . . . . . . . 132 \vss . . . . . . . . . . . .. . . ..... 199, 378
\pst@makebox . . . . . . . . . . . . . . . . . 132 \VTeXversion . . . . .. . . ..... 254, 344
\pst@ManualBoxFill . . . . 139, 141, 141
\pst@ManualFillCycle 192, 194, 206, 206 W
\pst@newpath . . . . . . . . . . . . . . . . . 157 \wd ......... 171, 186, 212, 387, 407

Change History

v0.93 changes to do ‘tiling’ rather


General: With a \PstTil- than ‘filling’ in "automatic"
ing macro defined (or mode : - we fix the position
"tiling" optional parameter of the beginning of tiling, - we
on \usepackage[tiling]pst-fill) allow normally the framing of
there are several add-ons and the area as expected, using the

36
line.... parameters - we define as the original boxfill.tex
move parameters fillmovex, fill- file from Timothy, version
movey and fillmove, - we define 0.94, except a correction in
fillcyclex as previous fillcycle \pst@ManualFillCycle to avoid
parameter, and add the fillcy- a division by 0. It’s the default. 1
cley and fillcycle (both fillcyclex v0.97
and fillcycley) ones - we can ex- General: make it work with VTeX
tend the tiling area using fill- (mv) . . . . . . . . . . . . . . . . . . . 1
loopaddx, fillloopaddy and fil- v0.98
lloopadd parameters, - we can General: delete the Pst@Debug op-
debug and see the whole tiling tion and use the the one from
area without clipping using Pst- pstricks to prevent a clash with
Debug parameter, - for names pst-gr3d (hv) . . . . . . . . . . . . . 1
consistancy, we can use fillan-
v0.99
gle in place of boxfillangle and
fillsize in place of boxfillsize, - General: merge the VTeX and TeX
default value for fillsep is 0 and versions (patch 4) (hv) . . . . . . 1
for fillsize is auto. . . . . . . . . . . 1 v1.00
v0.94 General: use pst-xkey for extend
General: With a truemacro defined keys (hv) . . . . . . . . . . . . . . . . 1
(or "tiling" optional parame- v1.01
ter on \usepackage[tiling]pst- General: bugfix for incomplete ifx
fill), this file run exactly (hv) . . . . . . . . . . . . . . . . . . . . 1

37

You might also like