NAME
pslib 4.0 - A PostScript based plotting library
DESCRIPTION
pslib was created to make the generation of PostScript page description
code easier. It is a library that contains a series of tools that can
be used to create plots. The resulting PostScript code is ASCII text
and can be edited using any text editor. Thus, it is fairly easy to
modify a plot file even after it has been created, e.g., to change text
strings, set new gray shades or colors, experiment with various pen
widths, etc. pslib is written in C but now includes FORTRAN bindings
(thanks to John Goff, WHOI) and can therefore be called from both C and
FORTRAN programs. To use this library, you must link your plotting pro-
gram with pslib.a. pslib is the core of the GMT SYSTEM and XY graphics
programs. pslib output conforms to the Adobe Encapsulated PostScript
File Specification Version 3.0 (EPSL), and may be used as EPS files and
inserted into, say, a Word document on a Mac. See Appendix F in the
Technical Reference for detailed instructions.
Before any pslib calls can be issued, the plotting system must be ini-
tialized. This is done by calling ps_plotinit, which defines macros,
sets up the plot-coordinate system, scales, and [optionally] opens a
file where all the PostScript code will be written. Normally, the plot
code is written to stdout. The measure unit for sizes and positions can
be set to be centimeter (c), inch (i), or meter (m). When all plotting
is done, you must terminate the plotting system by calling ps_plotend.
pslib uses the direct color model where red, green, and blue are given
separately, each must be in the range from 0-255. If red < 0 then no
fill operation takes place. Most plot-items can be plotted with or
without outlines. If outline is desired (i.e., set to 1), it will be
drawn using the current linewidth and pattern. pslib uses highly opti-
mized macro substitutions and scales the coordinates depending on the
resolution of the hardcopy device so that the output file is kept as
compact as possible.
A wide variety of output devices that support PostScript exist, includ-
ing laserwriters (color or monochrome) and workstations running
PostScript based window systems like SUNs OpenWindows. xnews (part of
OpenWindows) or ghostscript (public domain) can be used to create
rasterfiles at a user-defined resolution (DPI), making it possible to
render PostScript on a Versatec and other non-PostScript raster
devices. Regular SUN rasterfiles created under NeWS from PostScript
files can be sent to a variety of color hardcopy units. Check the
devices available on your network.
FUNCTION CALLS
The following is a list of available functions and a short description
of what they do and what parameters they expect. All floating point
variables are expected to be double (i.e., 8 bytes), whereas all inte-
gers are assumed to be 4 bytes long. All plotting functions are
declared as functions returning an int. Currently, the return value is
undefined.
void ps_arc (x, y, radius, angle1, angle2, status)
double x, y, radius, angle1, angle2;
int status;
Draws a circular arc centered on (x,y) from angle angle1 to
angle2. Angles must be given in decimal degrees. If angle1 >
angle2, a negative arc is drawn. status is a value from 0
through 3. 1 means set new anchor point, 2 means stroke the
circle, 3 means both, 0 means none of the above.
void ps_axis (xpos, ypos, length, startval, stopval, tickval,
label, annotpointsize, side)
double xpos, ypos, length, startval, stopval, tickval;
double annotpointsize, side;
char *label;
Plots an axis with tickmarks, annotation, and label. xpos,
ypos, and length are in inches (or cm or meters), annotpoint-
size in points (72 points = 1 inch), else data units are
used. side can be 0, 1, 2, or 3, which selects lower x-axis,
right y-axis, upper x-axis, or left y-axis, respectively.
labelpointsize = 1.5 * annotpointsize. A negative tickval
will reverse the sense of positive direction, e.g., to have
the y-axis be positive down.
void ps_circle (xcenter, ycenter, diameter, rgb, outline)
double xcenter, ycenter, diameter;
int rgb[3], outline;
Plots a circle and fills it with the specified color. If out-
line == 1, the outline will be drawn using current pen-width
and -pattern.
void ps_clipoff ()
Resets the clip path to what it was before the last call to
ps_clipon.
void ps_clipon (xarray, yarray, npoints, rgb, flag)
double xarray[], yarray[];
int npoints, rgb[3], flag;
Sets up a user-definable clip path. Plotting outside this
polygon will be clipped until ps_clipoff is called. If red >=
0 the inside of the path is filled with the specified color.
flag is used to create complex clip paths consisting of sev-
eral disconnected regions, and takes on values 0-3. flag = 1
means this is the first path in a multi-segment clip path.
flag = 2 means this is the last segment. Thus, for a single
path, flag = 3.
void ps_colorimage (xpos, ypos, xlength, ylength, buffer, nx,
ny, depth)
double xpos, ypos, xlength, ylength;
unsigned char buffer[];
int nx, ny, depth;
Plots a 1-, 4-, 8-, or 24-bit deep image. The pixel values
are stored in buffer. This functions sets up a call to the
PostScript colorimage or image operators. If -depth is
passed instead then rgb is converted to cmyk first. Specify
position of lower left corner and size (in inches) of image.
buffer is an unsigned character array in scanline orientation
with gray shade or r,g, b values (0 - 255) where 0 is black,
255 is white. depth is number of bits pr pixel (24, 8, 4, or
1). nx,ny refers to the number of pixels in image. The
rowlength of buffer must be an integral number of 8/depth.
buffer[0] is upper left corner. E.g. if depth = 4, then
buffer[j]/16 gives shade for pixel[2j-1] and buffer[j]%16
(mod 16) gives shade for pixel[2j]. If -nx is passed then
the first three bytes of buffer holds the r/g/b color for
pixels that are to be masked out using the PostScript Level 3
Color Mask method. See the Adobe Systems PostScript Refer-
ence Manual for more details.
void ps_colortiles (x0, y0, xlength, ylength, buffer, nx, ny)
double x0, y0, xlength, ylength;
int nx, ny;
unsigned char buffer[];
Plots a true color image based on individual color tiles. x0,
y0 is the location of the lower left corner of the image in
inches. xlength, ylength is the image size in inches. buffer
contains rgb triplets stored as rgbrgbrgb... nx, ny is the
image size in pixels.
void ps_command (text)
char *text;
Writes a raw PostScript command to the PostScript output
file, e.g. "1 setlinejoin".
void ps_comment (text)
char *text;
Writes a comment (text) to the PostScript output file, e.g.
"Start of graph 2".
void ps_cross (xcenter, ycenter, diameter)
double xcenter, ycenter, diameter;
Plots a cross at the specified point using current pen-width
and -pattern that fits inside a circle of given diameter.
void ps_diamond (xcenter, ycenter, diameter, rgb, outline)
double xcenter, ycenter, diameter;
int rgb[3], outline;
Plots a diamond and fills it with the specified color. If
outline == 1, the outline will be drawn using current pen-
width and -pattern. The symbol will fit inside a circle of
given diameter.
void ps_ellipse (xcenter, ycenter, angle, major, minor, rgb,
outline)
double xcenter, ycenter, angle, major, minor;
int rgb[3], outline;
Plots a ellipse with its major semiaxis rotated by angle
degrees and fills it with the specified color. If outline ==
1, the outline will be drawn using current pen-width and
-pattern.
void ps_encode_font (font_no)
int font_no;
Will reencode this font using the current encoding vector if
it is not StandardEncoding.
void ps_flush ()
Flushes the output buffer.
void ps_hexagon (xcenter, ycenter, diameter, rgb, outline)
double xcenter, ycenter, diameter;
int rgb[3], outline;
Plots a hexagon and fills it with the specified color. If
outline == 1, the outline will be drawn using current pen-
width and -pattern. The symbol will fit inside a circle of
given diameter.
void ps_image (xpos, ypos, xlength, ylength, buffer, nx, ny,
bits)
double xpos, ypos, xlength, ylength;
unsigned char buffer[];
int nx, ny, bits;
Obsolete, simply passes arguments to ps_colorimage.
void ps_imagefill (x, y, n, image, imagefile, invert, imagedpi,
outline, template, r_rgb, b_rgb)
double x[], y[], x0, y0;
int n, image, invert, imagedpi, outline, template, f_rgb[3],
b_rgb[3];
char imagefile;
Similar to ps_polygon, but fills the area with an image pat-
tern rather than a color or grayshade. x and y hold the
arrays of n points. 90 predefined patterns are available (See
GMT Appendix E). image gives the image number (1-90). If set
to 0, imagefile must be the name to the user’s image, which
must be stored as a SUN 1-, 8-, or 24-bit rasterfile. 1-bit
images only: (i) If invert is TRUE (1), the black and white
pixels are interchanged before plotting. (ii) If template is
TRUE (1), the set pixels are colored using the RGB combina-
tion in f_rgb, while the unset are painted with b_rgb. The
unit size of the image is controlled by imagedpi. If set to
zero, the image is plotted at the device resolution. If out-
line is TRUE, the current penwidth is used to draw the poly-
gon outline.
void ps_imagemask (xpos, ypos, xlength, ylength, buffer, nx, ny,
polarity, rgb)
double xpos, ypos, xlength, ylength;
unsigned char buffer[];
int nx, ny, polarity, rgb[3];
Plots a transparent 1-bit image mask using the given rgb
color. Specify position of lower left corner and size (in
inches) of image. buffer is an unsigned character array with
8 pixels per byte. nx,ny refers to the number of pixels in
image. The rowlength of buffer must be an integral number of
8. buffer[0] is upper left corner. buffer values are stored
as columns, starting at the lower left corner and ending at
the upper right corner. If polarity is 0 then the bits that
are 0 are painted with the rgb color, else the bits that are
1 are colored. See the Adobe Systems PostScript Reference
Manual for more details.
void ps_itriangle (xcenter, ycenter, diameter, rgb, outline)
double xcenter, ycenter, diameter;
int rgb[3], outline;
Plots an inverted and fills it with the specified color. If
outline == 1, the outline will be drawn using current pen-
width and -pattern. The symbol will fit inside a circle of
given diameter.
void ps_line (xarray, yarray, npoints, type, close, split)
double xarray[], yarray[];
int npoints, type, close, split;
Draw a continuous line from the positions in the x-y arrays.
If close == 1, the first and last point will automatically be
closed by the PostScript driver. If this is the first seg-
ment in a multi-segment path, set type == 1. To end the seg-
ments and have the line(s) drawn, set type == 2. Thus, for a
single segment, type must be 3. The line is drawn using the
current penwidth. Only if split is TRUE may ps_line use mul-
tiple strokes to draw lines longer that MAX_PATH. ps_polygon
will call ps_line with split = FALSE since the path must be
continuous. If split is FALSE and the pathlength exceeds
MAX_PATH a warning will be issued.
unsigned char *ps_loadraster (fp, header, invert, monochrome,
template, f_rgb, b_rgb)
FILE *fp;
struct rasterfile *header;
BOOLEAN invert, monochrome, template;
int f_rgb[], b_rgb[];
Reads the image contents of the Sun rasterfile pointed to by
the open filepointer fp. The header must first be obtained
with ps_read_rasheader. If invert is TRUE then 1-bit images
will be bit-reversed. If monochrome is TRUE then color images
are converted to grayimages using the TV YIQ translation. If
template is TRUE then 1-bit images will be colorized using
the for- and background colors provided in f_rgb and b_rgb.
The routine can handle 1-, 8-, 24-, or 32-bit files in old,
standard, run-length encoded, or RGB-style Sun format.
void ps_octagon (xcenter, ycenter, diameter, rgb, outline)
double xcenter, ycenter, diameter;
int rgb[3], outline;
Plots a octagon and fills it with the specified color. If
outline == 1, the outline will be drawn using current pen-
width and -pattern. The symbol will fit inside a circle of
given diameter.
void ps_patch (xarray, yarray, npoints, rgb, outline)
double xarray[], yarray[];
int npoints, rgb[3], outline;
Identical to ps_polygon except polygon must be < 20 points
long and there will be no attempt to shorten the path by dis-
carding unnecessary intermediate points along straight seg-
ments. Primarily used when painting large number of small
polygons and not waste output space.
void ps_pentagon (xcenter, ycenter, diameter, rgb, outline)
double xcenter, ycenter, diameter;
int rgb[3], outline;
Plots a pentagon and fills it with the specified color. If
outline == 1, the outline will be drawn using current pen-
width and -pattern. The symbol will fit inside a circle of
given diameter.
void ps_pie (xcenter, ycenter, radius, azimuth1, azimuth2, rgb,
outline)
double xcenter, ycenter, radius, azimuth1, azimuth2;
int rgb[3], outline;
Plots a sector of a circle and paints it with the specified
RGB combination. If outline == 1, the outline will be drawn
using current pen-width and -pattern.
void ps_plot (xabs, yabs, kpen)
double xabs, yabs;
int kpen;
Absolute move (kpen=3) or draw (kpen=2), using current
linewidth. Use (kpen=-2) to make sure the line is stroked.
void ps_plotend (last_page)
int last_page;
Terminates the plotting sequence and closes plot file (if
other than stdout). If last_page == 1, then a PostScript
showpage command is issued, which initiates the printing pro-
cess on hardcopy devices.
void ps_plotinit (plotfile, overlay, mode, xoff, yoff, xscl,
yscl, ncopies, dpi, unit, pagesize, rgb, encoding, eps)
char *plotfile, *encoding;
int overlay, mode, ncopies, dpi, unit;
double xoff, yoff, xscl, yscl;
int pagesize[2], rgb[3]; struct EPS * eps;
Initializes the plotting. If plotfile == NULL (or ""), then
output is sent to stdout, else output is sent to plotfile.
overlay should be 1 only if you plan to append it to some
existing PostScript file. mode contains three flags in the
three lowest bits. The lowest bit controls the plot orienta-
tion and can be 0 (Landscape) or 1 (Portrait). The next bit,
if set to 1, will re-encode the fonts to include European
accented characters using the now-obsolete GMT3.4 encoding.
To use the ISOLatin1 encoding set the 5th bit to 1. The third
bit controls the format used to write PostScript images: 0
means binary, 1 means hexadecimal. Most printers needs the
latter while some can handle binary which are 50% smaller and
therefore execute faster. xoff,yoff are used to move the
origin from the default position in the lower left corner.
xscl,yscl are used to scale the entire plot (Usually set to
1.0, 1.0). Set ncopies to get more than 1 copy. dpi sets the
hardcopy resolution in dots pr units. For optimum plot qual-
ity and processing speed, choose dpi to match the intended
plotter resolution. Examples are 300 for most laserwriters,
2540 for Linotype-300, and ~85 for SUN screens. When in
doubt, use 300. unit can be any of 0 (CM), 1 (INCH), or 2
(M), telling the plot system what units are used for distance
and sizes. Note that, regardless of choice of unit, dpi is
still in dots-pr-inch. pagesize means the physical width and
height of the plotting media in points, (typically 612 by 792
for Letter or 595 by 842 for A4 laserwriter plotters. The rgb
array holds the color of the page (usually white =
255,255,255). The encoding is the name of a character encod-
ing scheme to be used, e.g., Standard, ISOLatin1, ISO-8859-2,
etc. The EPS structure is defined in the pslib.h include
file and contains information that will make up the comments
header of a EPS file. Programmers who plan to call pslib
routines should read the comments in pslib.h first. Note that
the FORTRAN binding does not expect this last argument.
void ps_plotr (xrel, yrel, kpen)
double xrel, yrel;
int kpen;
Move (kpen = 3) or draw (kpen = 2) relative to current point
(see ps_plot). Use (kpen=-2) to make sure the line is
stroked.
void ps_polygon (xarray, yarray, npoints, rgb, outline)
double xarray[], yarray[];
int npoints, rgb[3], outline;
Creates a colored polygon from the positions in the x-y
arrays. Polygon will automatically be closed by the
PostScript driver. If outline == 0, no outline is drawn. If
outline == 1, the outline is drawn using current penwidth.
int ps_read_rasheader (fp, header)
FILE *fp;
struct rasterfile *header;
Using the pointer fp to the open file, return the header
structure of the Sun rasterfile. This call is portable as it
operates on the byte level. Once the header is returned you
may obtain the raster image with ps_loadraster.
void ps_rect (x1, y1, x2, y2, rgb, outline)
double x1, y1, x2, y2;
int red, green, blue, outline;
Plots a colored rectangle. (x1,y1) and (x2,y2) are any two
corners on a diagonal. If outline == 1, the outline will be
drawn using current pen-width and -pattern.
void ps_rotatetrans (x, y, angle)
double x, y, angle;
Rotates the coordinate system by angle degrees, then trans-
lates origin to (x,y).
void ps_setdash (pattern, offset)
char *pattern;
int offset;
Changes the current dashpattern. The character string pattern
is set to the desired pattern. E.g., "4 2" and offset = 1
will plot like:
x ---- ---- ----
etc, where x is starting point (The x is not plotted). That
is, the line is made up of a repeating pattern of a 4 units
long line and a 2 unit long gap, starting 1 unit after the x.
To reset to solid line, specify pattern = NULL ("") and off-
set = 0. Units are in dpi units.
void ps_setfont (fontnr)
int fontnr;
Changes the current font number to fontnr. The fonts avail-
able are: 0 = Helvetica, 1 = H. Bold, 2 = H. Oblique, 3 = H.
Bold-Oblique, 4 = Times, 5 = T. Bold, 6 = T. Italic, 7 = T.
Bold Italic, 8 = Courier, 9 = C. Bold, 10 = C Oblique, 11 = C
Bold Oblique, 12 = Symbol, 13 = AvantGarde-Book, 14 =
A.-BookOblique, 15 = A.-Demi, 16 = A.-DemiOblique, 17 = Book-
man-Demi, 18 = B.-DemiItalic, 19 = B.-Light, 20 = B.-LightI-
talic, 21 = Helvetica-Narrow, 22 = H-N-Bold, 23 = H-N-
Oblique, 24 = H-N-BoldOblique, 25 = NewCenturySchlbk-Roman,
26 = N.-Italic, 27 = N.-Bold, 28 = N.-BoldItalic, 29 =
Palatino-Roman, 30 = P.-Italic, 31 = P.-Bold, 32 =
P.-BoldItalic, 33 = ZapfChancery-MediumItalic, 34 = ZapfDing-
bats, 35 = Ryumin-Light-EUC-H, 36 = Ryumin-Light-EUC-V, 37 =
GothicBBB-Medium-EUC-H, and 38 = GothicBBB-Medium-EUC-V. If
fontnr is outside this range, it is set to 0.
void ps_setformat (n_decimals)
int n_decimals;
Sets number of decimals to be used when writing color or gray
values. The default setting of 3 gives 1000 choices per red,
green, and blue value, which is more than the 255 choices
offered by most 24-bit platforms. Choosing a lower value will
make the output file smaller at the expense of less color
resolution. Still, a value of 2 gives 100 x 100 x 100 = 1
million colors, more than most eyes can distinguish. For a
setting of 1, you will have 10 nuances per primary color and
a total of 1000 unique combinations.
void ps_setline (linewidth)
int linewidth;
Changes the current linewidth in DPI units. 0 gives thinnest
line, but the use of 0 is implementation-dependent (Works
fine on most laserwriters).
void ps_setpaint (rgb)
int rgb[3];
Changes the current RGB setting for pens and text.
void ps_square (xcenter, ycenter, diameter, rgb, outline)
double xcenter, ycenter, diameter;
int rgb[3], outline;
Plots a square and fills it with the specified color. If out-
line == 1, the outline will be drawn using current pen-width
and -pattern. The symbol will fit inside a circle of given
diameter.
void ps_star (xcenter, ycenter, diameter, rgb, outline)
double xcenter, ycenter, diameter;
int rgb[3], outline;
Plots a star and fills it with the specified color. If out-
line == 1, the outline will be drawn using current pen-width
and -pattern. The symbol will fit inside a circle of given
diameter.
void ps_text (x, y, pointsize, text, angle, justify, form)
double x, y, pointsize, angle;
char *text;
int justify, form;
The text is plotted starting at (x,y), and will make an angle
with the horizontal. The point (x,y) maps onto different
points of the textstring by giving various values for jus-
tify. It is used as follows:
9------------10----------- 11
| |
5 6 7
| |
1------------ 2------------ 3
The box represents the textstring. E.g., to plot a textstring
with its center of gravity at (x,y), you must use justify ==
6. If justify is negative, then all leading and trailing
blanks are stripped before plotting. Certain character
sequences (flags) have special meaning to ps_text. @~ toggles
between current font and the Mathematical Symbols font.
@%no% sets font to no; @%% resets to starting font. @- turns
subscript on/off, @+ turns superscript on/off, @# turns small
caps on/off, and @\ will make a composite character of the
following two character. Give fontsize in points (72 points
= 1 inch). Normally, the text is typed using solid charac-
ters. To draw outline characters, set form == 1. If point-
size is negative it means that the current point has already
been set before ps_text was called and that (x,y) should be
ignored.
void ps_textbox (x, y, pointsize, text, angle, justify, outline,
dx, dy, rgb)
double x, y, angle, pointsize, dx, dy;
char *text;
int justify, outline, rgb[3];
This function is used in conjugation with ps_text when a box
surrounding the text string is desired. Taking most of the
arguments of ps_text, the user must also specify the color of
the resulting rectangle, and whether its outline should be
drawn. More room between text and rectangle can be obtained
by setting dx and dy accordingly.
void ps_transrotate (x, y, angle)
double x, y, angle;
Translates the origin to (x,y), then rotates the coordinate
system by angle degrees.
void ps_triangle (xcenter, ycenter, diameter, rgb, outline)
double xcenter, ycenter, diameter;
int rgb[3], outline;
Plots a triangle and paints it with the specified RGB combi-
nation. If outline == 1, the outline will be drawn using cur-
rent pen-width and -pattern. The symbol will fit inside a
circle of given diameter.
void ps_vector (xtail, ytail, xtip, ytip, tailwidth, headlength,
headwidth, headshape, rgb, outline)
double xtail, ytail, xtip, ytip, tailwidth, headlength, head-
width, headshape;
int rgb[3], outline;
Draws a vector of size and appearance as specified by the
various parameters. headshape can take on values from 0-1 and
specifies how far the intersection point between the base of
a straight vector head and the vector line is moved toward
the tip. 0 gives a triangular head, 1.0 gives an arrow shaped
head. If outline == 1, the outline will be drawn using cur-
rent penwidth. Add 8 to outline for a double-headed vector.
void ps_words (x, y, text, n_words, line_space, par_width,
par_just, font, font_size, angle, rgb, justify, draw_box, x_off,
y_off, x_gap, y_gap, boxpen_width, boxpen_texture, boxpen_off-
set, boxpen_rgb, vecpen_width, vecpen_texture, vecpen_offset,
vecpen_rgb, boxfill_rgb)
double x, y, line_space, par_width, angle, x_off, y_off, x_gap,
y_gap;
int n_words, font, font_size, justify, draw_box, boxpen_width,
boxpen_offset;
int boxpen_rgb[3], vecpen_width, vecpen_offset, vecpen_rgb[3],
boxfill_rgb[3];
char **text, *boxpen_texture, *vecpen_texture;
Typesets paragraphs of text. text is an array of the words to
typeset, using the given line-spacing and paragraph width.
The whole text block is positioned at x, y which is the
anchor point on the box as indicated by justify (see
ps_text). The whole block is then shifted by x_off, y_off.
Inside the box, text is justified left, centered, right, or
justified as governed by par_just (lcrj). draw_box contains
4 bit flags pertaining to the surrounding outline box. If on,
the first (lowest) bit draws the box outline. The second bit
fills the box interior. The third bit makes the outline box
have rounded corners (unless x_gap, y_gap, which specifies
the padding between the text and the box, are zero), while
the forth bit draws a line from the original x, y point to
the shifted position. The escape sequences described for
ps_text applies here, as well as two additional commands:
@;r/g/b; changes the font color (@;; resets it), and @:size:
changes the font size (@:: resets it).
AUTHOR
Paul Wessel, School of Ocean and Earth Science and Technology, 1680
East-West Road, Honolulu, Hawaii 96822, (808) 956-4778, Internet
address: pwessel@hawaii.edu.
BUGS
Caveat Emptor: The author is not responsible for any disasters, suicide
attempts, or ulcers caused by correct or incorrect use of pslib. If you
find bugs, please report them to the author by electronic mail. Be sure
to provide enough detail so that I can recreate the problem.
RESTRICTIONS
Due to the finite memory of some output devices like Laserwriters, cer-
tain restrictions due to limitations of the PostScript interpreter
apply: For now, the arrays passed to ps_clipon and ps_polygon must con-
tain less than about 1350 points. Also, the buffer array passed to
ps_image must be able to fit in the available memory. Check the speci-
fications of the hardcopy device you are using. Note that some Raster
Image Processors (RIPs) do not support direct color so that the colors
you get may not be exactly the ones you wanted. This is a limitation of
the RIP, not the underlying PostScript code generated by pslib.
REFERENCES
Adobe Systems Inc., 1990, PostScript language reference manual, 2nd
edition, Addison-Wesley, (ISBN 0-201-18127-4).
GMT4.0 1 Oct 2004 pslib(l)
Man(1) output converted with
man2html