summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/generic/pstricks/psd-spec.tex
blob: 1b7e205a3112bd8911c7232f292873757c28041b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
%% BEGIN psd-spec.tex

\part{Special Tricks\label{P-special}}

\Section{Coils and zigzags}

\File{pst-coil}
The file "pst-coil.tex"/"pst-coil.sty"  (and optionally the header file
"pst-coil.pro") defines the following graphics objects for coils and zigzags:
\begin{Ex}
  \object  \pscoil`*[par]{arrows}\c0'\c1
  \object  \psCoil`*[par]'{angle1}{angle2}
  \object  \pszigzag`*[par]{arrows}\c0'\c1
\end{Ex}

 These graphics objects use the following parameters:
\begin{Ex}
  \Par{coilwidth=dim}
  \Par{coilheight=num}
  \Par{coilarm=dim}
  \Par{coilaspect=angle}
  \Par{coilinc=angle}
\end{Ex}

All coil and zigzag objects draw a coil or zigzag whose width (diameter) is
\p{coilwidth}, and with the distance along the axes for each period (360
degrees) equal to
\begin{quote}
  \p{coilheight} x \p{coilwidth}.
\end{quote}

Both \n\pscoil{} and \n\psCoil{} draw a ``3D'' coil, projected onto the xz-axes.
The center of the 3D coil lies on the yz-plane at angle p{coilaspect} to the
z-axis. The coil is drawn with PostScript's "lineto", joining points that lie
at angle \p{coilinc} from each other along the coil. Hence, increasing
\p{coilinc} makes the curve smoother but the printing slower. \n\pszigzag\
does not use the \p{coilaspect} and \p{coilinc} parameters.

\n\pscoil{} and \n\pszigzag{} connect \c0  and \c1, starting and ending with
straight line segments of length \p{coilarmA} and \p{coilarmB}, resp. Setting
\p{coilarm} is the same as setting \p{coilarmA} and \p{coilarmB}.

Here is an example of \n\pscoil:
\begin{MEx}(4,2)
  \pscoil[coilarm=.5cm,linewidth=1.5pt,coilwidth=.5cm]{<-|}(4,2)
\end{MEx}

Here is an example of \n\pszigzag:
\begin{MEx}[0,-.5](4,.5)
  \pszigzag[coilarm=.5,linearc=.1]{<->}(4,0)
\end{MEx}
Note that \n\pszigzag{} uses the \p{linearc} parameters, and that the beginning
and ending segments may be longer than \p{coilarm} to take up slack.

\n\psCoil{} just draws the coil horizontally from <angle1> to <angle2>. Use
\n\rput{} to rotate and translate the coil, if desired. \n\psCoil{} does not use
the \p{coilarm} parameter. For example, with \p{coilaspect=0} we get a sine
curve:
\begin{MEx}[0,-.375](4,.375)
  \psCoil[coilaspect=0,coilheight=1.33,
    coilwidth=.75,linewidth=1.5pt]{0}{1440}
\end{MEx}

\File{pst-node}
"pst-coil.tex" also contains coil and zigzag node connections. You must also
load "pst-node.tex" / "pst-node.sty" to use these. The node connections are:
\begin{Ex}
  \object \nccoil`*[par]{arrows}'{nodeA}{nodeB}
  \object \nczigzag`*[par]{arrows}'{nodeA}{nodeB}
  \object \pccoil`*[par]{arrows}'\c1\c2
  \object \pczigzag`*[par]{arrows}'\c1\c2
\end{Ex}
The end points are chosen the same as for \n\ncline{} and \n\pcline, and
otherwise these commands work like \n\pscoil{} and \n\pszigzag. For example:
\begin{MEx}(4,3)
  \cnode(.5,.5){.5}{A}
  \cnode[fillstyle=solid,fillcolor=lightgray](3.5,2.5){.5}{B}
  \nccoil[coilwidth=.3]{<->}{A}{B}
\end{MEx}


\Section{Special coordinates\label{S-SpecialCoor}}

The command
  \Mac  \SpecialCoor
enables a special feature that lets you specify coordinates in a variety of
ways, in addition to the usual Cartesian coordinates.\footnote{%
There is an obsolete command \n\Polar\MainIndex\Polar{} that causes
coordinates in the form "(<r>,<a>)" to be interpreted as polar coordinates.
The use of \n\Polar{} is not recommended because it does not allow one to mix
Cartesian and polar coordinates the way \n\SpecialCoor{} does, and because it
is not as apparent when examining an input file whether, e.g., "(3,2)" is a
Cartesian or polar coordinate. The command for undoing \n\Polar{} is
\n\Cartesian\MainIndex\Cartesian. It has an optional argument for setting the
default units. I.e.,
\begin{LVerb*}
  \Cartesian(<x>,<y>)
\end{LVerb*}
has the effect of
\begin{LVerb*}
  \psset{xunit=<x>,yunit=<y>}
\end{LVerb*}
\n\Cartesian{} can be used for this purpose without using \n\Polar.}
Processing is slightly slower and less robust, which is why this feature is
available on demand rather than by default, but you probably won't notice the
difference.

Here are the coordinates you can use:
\begin{description}
 \vitem"(<x>,<y>)" The usual Cartesian coordinate. E.g., "(3,4)".
 \vitem"(<r>;<a>)" Polar coordinate, with radius $r$ and angle $a$. The
default unit for $r$ is \p{unit}. E.g., "(3;110)".
 \vitem"(<node>)" The center of <node>. E.g., "(A)".
 \vitem"([<par>]<node>)" The position relative to <node> determined using the
\p{angle}, \p{nodesep} and \p{offset} parameters. E.g., "([angle=45]A)".
 \vitem"(!<ps>)" Raw PostScript code. <ps> should expand to a coordinate pair.
The units \p{xunit} and \p{yunit} are used. For example, if I want to use a
polar coordinate $(3,110)$ that is scaled along with \p{xunit} and \p{yunit},
I can write
\begin{LVerb}
  (!3 110 cos mul 3 110 sin mul)
\end{LVerb}
 \vitem"(<coor1>|<coor2>)" The $x$ coordinate from <coor1> and the $y$
coordinate from <coor2>. <coor1> and <coor2> can be any other coordinates for
use with \n\SpecialCoor. For example, "(A|1in;30)".
\end{description}

\n\SpecialCoor{} also lets you specify angles in several ways:
\begin{description}
\vitem"<num>" A number, as usual, with units given by the \n\degrees{} command.
\vitem"(<coor>)" A coordinate, indicating where the angle points to. Be sure
to include the "()", in addition to whatever other delimiters the angle
argument uses.  For example, the following are two ways to draw an arc of .8
inch radius from 0 to 135 degrees:
\begin{MEx}(3,2)
  \SpecialCoor
  \psarc(0,0){.8in}{0}{135}
  \psarc(0,0){.8in}{0}{(-1,1)}
\end{MEx}
\vitem"!<ps>" Raw PostScript code. <ps> should expand to a number. The same
units are used as with <num>.
\end{description}

\newbox\specialbox
\setbox\specialbox=\hbox{%
  \bfseries
  \begin{tabular}{|c|c|l|}
    \hline
    \emph{Coordinate}   & \emph{Example}   & \emph{Description} \\[2pt]
    "(<x>,<y>)"         & "(3,4)"          & Cartesian coordinate.\\
    "(<r>;<a>)"         & "(3;110)"        & Polar coordinate.\\
    "(<node>)"          &  "(A)"           & Center of <node>.\\
    "([<par>]<node>)"   & "([angle=45]A)"  & Relative to <node>.\\
    "(!<ps>)"           & "(!5 3.3 2 exp)" & Raw PostScript.\\
    "(<coor1>|<coor2>)" & "(A|1in;30)"     & Combination.\\
    \hline\hline
    \emph{Angle}        & \emph{Example}   & \emph{Description} \\[2pt]
    "<num>"             & "45"             & Angle.\\
    "(<coor>)"          & "(-1,1)"         &  Coordinate (vector).\\
    "!<ps>"             & "!33 sqrt"       & Raw PostScript.\\
    \hline
  \end{tabular}}%
\addtoquickref{center}{%
  {\large\textbf{Special coordinates and angles}}\par
  \leavevmode\box\specialbox}

The command
  \Mac  \NormalCoor
disables the \n\SpecialCoor{} features.

\Section{Overlays\label{S-overlays}}

Overlays are mainly of interest for making slides, and the overlay macros
described in this section are mainly of interest to \TeX{} macro writers who
want to implement overlays in a slide macro package.  For example, the
"seminar.sty" package, a \LaTeX{} style for notes and slides, uses PSTricks to
implement overlays.

Overlays are made by creating an "\hbox" and then outputting the box several
times, printing different material in the box each time. The box is created by
the commands
  \Mac  \overlaybox < stuff >\Main\endoverlaybox
\LaTeX{} users can instead write:
\begin{LVerb*}
  \begin{overlaybox} <stuff> \end{overlaybox}
\end{LVerb*}

The material for overlay <string> should go within the scope of the command
  \Mac  \psoverlay{string}
<string> can be any string, after expansion. Anything not in the scope of any
\n\psoverlay{} command goes on overlay "main", and material within the scope of
{\UsageFont "\psoverlay{all}"} goes on all the overlays. \n\psoverlay\
commands can be nested and can be used in math mode.

The command
  \Mac  \putoverlaybox{string}
then prints overlay <string>.

Here is an example:
\begin{example}
  \overlaybox
    \psoverlay{all}
    \psframebox[framearc=.15,linewidth=1.5pt]{%
      \psoverlay{main}
      \parbox{3.5cm}{\raggedright
        Foam Cups Damage Environment {\psoverlay{one} Less than
        Paper Cups,} Study Says.}}
  \endoverlaybox

  \putoverlaybox{main} \hspace{.5in} \putoverlaybox{one}
\end{example}

\begin{drivers} Overlays use \n\pstVerb{} and \n\pstverbscale.\end{drivers}

\section{The gradient fill style}

\File{pst-grad}
The file "pst-grad.tex"/"pst-grad.sty", along with the PostScript header file
"pst-grad.pro", defines the "gradient" \p{fillstyle}, for gradiated shading.
This \p{fillstyle} uses the following parameters:
\begin{description}
  \pitem[gradbegin=color] The starting and ending color.
  \pitem[gradend=color]  The color at the midpoint.
  \pitem[gradlines=int] The number of lines. More lines means finer
gradiation, but slower printing.
  \pitem[gradmidpoint=num] The position of the midpoint, as a fraction of the
distance from top to bottom. <num> should be between 0 and 1.
  \pitem[gradangle=angle] The image is rotated by <angle>.
\end{description}

\p{gradbegin} and \p{gradend} should preferably be "rgb" colors, but grays and
"cmyk" colors should also work. The definitions of the colors "gradbegin" and
"gradend" are:
\begin{LVerb}
  \newrgbcolor{gradbegin}{0 .1 .95}
  \newrgbcolor{gradend}{0 1 1}
\end{LVerb}
Here are two ways to change the gradient colors:
\begin{LVerb}
  \newrgbcolor{gradbegin}{1 .4 0}
\end{LVerb}
and
\begin{LVerb}
  \psset{gradbegin=blue}
\end{LVerb}

Try this example:
\begin{LVerb}
  \psframe[fillstyle=gradient,gradangle=45](10,-20)
\end{LVerb}

% D.G. modification begin - Mar.  7, 2003
%\section{Adding color to tables\label{S-colortab}}

%\File{colortab}
%The file "colortab.tex"/"colortab.sty" contains macros that, when used with
%color commands such as those in PSTricks, let you color the cells and lines in
%tables. See "colortab.doc" for more information.
% D.G. modification end

\Section{Typesetting text along a path}

\File{pst-text}
The file "pst-text.tex"/"pst-text.sty" defines the command \n\pstextpath, for
typesetting text along a path. It is a remarkable trick, but there are some
caveats:

\begin{itemize}\label{tp-res}
  \item "pst-text.tex" only works with certain DVI-to-PS drivers. Here is what
is currently known:
\begin{itemize}
  \item It works with Rokicki's "dvips".
  \item ``Does not work'' means that it has no effect, for better or for worse.
  \item This may work with other drivers. The requirement is that the driver
  only use PostScript's "show" operator, unbound and unloaded, to show
  characters.
\end{itemize}

  \item You must also have installed the PostScript header file "pst-text.pro",
  and \n\pstheader{} must be properly defined in "pstricks.con" for your
  driver.

  \item Like other PSTricks that involve rotating text, this works best with
  PostScript (outline) fonts.

  \item PostScript rendering with "pst-text.tex" is slow.
\end{itemize}

Because of all this, no samples are shown here. However, there is a test file
"tp-test.tex" and PostScript output "tp-test.ps" that are distributed with
PSTricks.

Here is the command:
  \Mac \pstextpath`[pos](x,y)'{graphics object}{text}

<text> is placed along the path, from beginning to end, defined by the
PSTricks graphics object. (This object otherwise behaves normally. Set
\p{linestyle=none} if you don't want it to appear.)

<text> can only contain characters. No TeX{} rules, no PSTricks, and no other
"\special"'s. (These things don't cause errors; they just don't work right.)
Math mode is OK, but math operators that are built from several characters
(e.g., large integral signs) may break. Entire boxes (e.g., "\parbox") are OK
too, but this is mainly for amusement.

<pos> is either
\begin{center}
  \begin{tabular}{cl}
    l & justify on beginning of path\\
    c & center on path\\
    r & justify on end of path.
  \end{tabular}
\end{center}
The default is "l".

"(<x>,<y>)" is an offset. Characters are shifted distance <x> along path, and
are shifted up by <y>. ``Up'' means with respect to the path, at whatever
point on the path corresponding to the middle of the character. "(<x>,<y>)"
must be Cartesian coordinates. Both coordinates use \n\psunit{} as the default.
The default coordinate is "(0,\TPoffset)", where \n\TPoffset{} a command whose
default value is "-.7ex". This value leads to good spacing of the characters.
Remember that "ex" units are for the font in effect when \n\pstextpath{}
occurs, not inside the <text> argument.

More things you might want to know:
\begin{itemize}
 \item Like with "\rput" and the graphics objects, it is up to you to leave
space for "\pstextpath".
 \item Results are unpredictable if <text> is wider than length of path.
 \item "\pstextpath" leaves the typesetting to \TeX. It just intercepts the
"show" operator to remap the coordinate system.
\end{itemize}

\Section{Stroking and filling character paths}

\File{pst-char}
The file "pst-char.tex"/"pst-char.sty" defines the command:
  \Mac \pscharpath`*[par]'{text}
It strokes and fills the <text> character paths using the PSTricks
\p{linestyle} and \p{fillstyle}.

The restrictions on DVI-to-PS drivers listed on page \pageref{tp-res} for
"\pstextpath" apply to "\pscharpath". Furthermore, only outline (PostScript)
fonts are affected.

Sample input and output files "chartest.tex" and "chartest.ps" are distributed
with PSTricks.

With the optional "*", the character path is not removed from the PostScript
environment at the end. This is mainly for special hacks. For example, you can
use "\pscharpath*" in the first argument of "\pstextpath", and thus typeset
text along the character path of some other text. See the sample file
"denis1.tex". (However, you cannot combine "\pscharpath" and "\pstextpath" in
any other way. E.g., you cannot typeset character outlines along a path, and
then fill and stroke the outlines with "\pscharpath".)

The command
  \Mac \pscharclip`*[par]'{text} ... \Main  \endpscharclip
works just like \n\pscharpath, but it also sets the clipping path to the
character path. You may want to position this clipping path using \n\rput{}
\emph{inside} \n\pscharclip's argument. Like \n\psclip{} and \n\endpsclip,
\n\pscharclip{} and \n\endpscharclip{} should come on the same page and should
be properly nested with respect to \TeX{} groups (unless \n\AltClipMode{} is
in effect). The file "denis2.tex" contains a sample of \n\pscharclip.


\section{Importing EPS files}

PSTricks does not come with any facility for including Encapsulated PostScript
files, because there are other very good and well-tested macros for exactly
that, specially the "graphicx" package for \LaTeX, usable also with \TeX.

What PSTricks \emph{is} good for is embellishing your EPS picture. You can
include an EPS file in in the argument of \n\rput, as in
\begin{LVerb}
  \rput(3,3){\epsfbox{myfile.eps}}
\end{LVerb}
and hence you can include an EPS file in the \n\pspicture{} environment. Turn
on \n\psgrid, and you can find the coordinates for whatever graphics or text
you want to add. This works even when the picture has a weird bounding box,
because with the arguments to \n\pspicture{} you control the bounding box from
\TeX's point of view.

This isn't always the best way to work with an EPS file, however. If the
PostScript file's bounding box is the size you want the resulting picture to
be, after your additions, then try
\begin{LVerb*}
  \hbox{<picture objects> \includegraphics{<file.eps>}
\end{LVerb*}
This will put all your picture objects at the lower left corner of the EPS
file.

If you need to determine the bounding box of an EPS file, then you can try of
the automatic bounding box calculating programs, such as "bbfig" (distributed
with Rokicki's "dvips"). However, all such programs are easily fooled; the
only sure way to determine the bounding box is visually. \n\psgrid{} is a good
tool for this.

\Section{Exporting EPS files}

\File{pst-eps}
You must load "pst-eps.tex" or "pst-eps.sty" to use the PSTricks macros
described in this section.

If you want to export an EPS file that contains both graphics and text, then
you need to be using a DVI-to-PS driver that suports such a feature. If you
just want to export pure graphics, then you can use the \n\PSTricksEPS{}
command. Both of these options are described in this section.

Newer versions of Rokicki's "dvips" support an "-E" option for creating EPS
files from \TeX{} ".dvi" files. E.g.,
\[
  dvips foo.dvi -E -o foo.eps
\]
Your document should be a single page. "dvips" will find a tight bounding box
that just encloses the printed characters on the page. This works best with
outline (PostScript) fonts, so that the EPS file is scalable and resolution
independent.

There are two inconvenient aspects of this method. You may want a different
bounding box than the one calculated by "dvips" (in particular, "dvips"
ignores all the PostScript generated by PSTricks when calculating the bounding
box), and you may have to go out of your way to turn off any headers and
footers that would be added by output routines.

PSTricks contains an environment that tries to get around these two problems:
\begin{Ex}
  \object  \TeXtoEPS
  "  "<stuff>\\
  \object  \endTeXtoEPS
\end{Ex}
This is all that should appear in your document, but headers and whatever that
would normally be added by output routines are ignored. "dvips" will again try
to find a tight bounding box, but it will treat <stuff> as if there was a
frame around it. Thus, the bounding box will be sure to include <stuff>, but
might be larger if there is output outside the boundaries of this box. If the
bounding box still isn't right, then you will have to edit the
\begin{LVerb*}
  %%BoundingBox <llx lly urx ury>
\end{LVerb*}
specification in the EPS file by hand.

If your goal is to make an EPS file for inclusion in other documents, then
"dvips -E" is the way to go. However, it can also be useful to generate an EPS
file from PSTricks graphics objects and include it in the same document,%
\footnote{See the preceding section on importing EPS files.}
rather than just including the PSTricks graphics directly, because \TeX{} gets
involved with processing the PSTricks graphics only when the EPS file is
initially created or updated. Hence, you can edit your file and preview the
graphics, without having to process all the PSTricks graphics each time you
correct a typo. This speed-up can be significant with complex graphics such as
"\pslistplot"'s with a lot of data.

To create an EPS file from PSTricks graphics objects, use
  \Mac  \PSTtoEPS`[par]'{file}{graphics objects}
The file is created immediately, and hence you can include it in the same
document (after the \n\PSTtoEPS{} command) and as many times as you want.
Unlike with "dvips -E", only pure graphics objects are processed (e.g.,
"\rput" commands have no effect).

\n\PSTtoEPS{} cannot calculate the bounding box of the EPS file. You have to
specify it yourself, by setting the following parameters:
\begin{Ex}
  \Par{bbllx=dim}
  \Par{bblly=dim}
  \Par{bburx=dim}
  \Par{bbury=dim}
\end{Ex}
Note that if the EPS file is only to be included in a PSTricks picture with
\n\rput\, you might as well leave the default bounding box.

\n\PSTricksEPS{} also uses the following parameters:
\begin{description}
  \pitem[makeeps=none/new/all/all*]
  This parameter determines which \n\PSTtoEPS\ commands just skip over their arguments, and which create files, as follows:
  \begin{description}
  \vitem"none" No files are created.
  \vitem"new" Only those files not found {\em anywhere on the system\/} are created.
  \vitem"all" All files are created.
  \vitem"all*" All files are created, but you are asked for approval before existing files are deleted.
  \end{description}

  \pitem[headerfile=files]
  This parameter is for specifying PostScript header files that are to be
included in the EPS file. The argument should contain one or more file names,
separated by commas. If you have more than one file, however, the entire list
must be enclosed in braces "{}".

  \pitem[headers=none/all/user]
  When "none", no header files are included. When "all", the header files used
by PSTricks plus the header files specified by the \p{headerfile} parameter
are included. When "user", only the header files specified by the
\p{headerfile} parameter are included. If the EPS file is to be included in a
\TeX{} document that uses the same PSTricks macros and hence loads the relevant
PSTricks header files anyway (in particular, if the EPS file is to be included
in the same document), then \p{headers} should be "none" or "user".
\end{description}

\endinput
%% END psd-spec.tex