Plotutils
Plotutils
Robert S. Maier
Copyright
c 1989, 1990, 1991, 1995, 1996, 1997, 1998, 1999, 2000, 2005, 2008, 2009 Free
Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this manual under the terms of
the GNU Free Documentation License, Version 1.2 or any later version published by the
Free Software Foundation; with no Invariant Sections, no Front-Cover Texts and no Back-
Cover Texts. A copy of the license is included in the appendix entitled “The GNU Free
Documentation License”.
Chapter 1: The GNU Plotting Utilities 1
The pic2plot program can translate from the pic language to any supported output
format. The pic language, which was invented at Bell Laboratories, is used for creating box-
and-arrow diagrams of the kind frequently found in technical papers and textbooks. The cor-
responding commands are pic2plot -T X, pic2plot -T png, pic2plot -T pnm, pic2plot
-T gif, pic2plot -T ai, pic2plot -T ps, pic2plot -T cgm, pic2plot -T fig, pic2plot
-T pcl, pic2plot -T hpgl, pic2plot -T regis, pic2plot -T tek, and pic2plot.
The tek2plot program can translate from Tektronix format to any supported output
format. The corresponding commands are tek2plot -T X, tek2plot -T png, tek2plot
-T pnm, tek2plot -T gif, tek2plot -T svg, tek2plot -T ai, tek2plot -T ps, tek2plot
-T cgm, tek2plot -T fig, tek2plot -T pcl, tek2plot -T hpgl, tek2plot -T regis, and
tek2plot. tek2plot is useful if you have an older application that produces drawings in
Tektronix format.
The plotfont program is a simple utility that displays a character map for any font
that is available to graph, plot, pic2plot, or tek2plot. The 35 standard Postscript fonts
are available if the ‘-T X’, ‘-T ai’, ‘-T ps’, ‘-T cgm’, or ‘-T fig’ options are used. The
45 standard PCL 5 fonts (i.e., “LaserJet” fonts) are available if the ‘-T ai’, ‘-T pcl’ or
‘-T hpgl’ options are used. In the latter two cases (‘-T pcl’ and ‘-T hpgl’), a number
of Hewlett–Packard vector fonts are available as well. A set of 22 Hershey vector fonts,
including Cyrillic fonts and a Japanese font, is always available. When producing output
for an X Window System display, any of the graphics programs can use scalable X fonts.
Of the command-line mathematical programs, spline does spline interpolation of scalar
or vector-valued data. It normally uses either cubic spline interpolation or exponential
splines in tension, but like graph it can function as a real-time filter under some circum-
stances. Besides splining datasets, it can construct curves, either open or closed, through
arbitrarily chosen points in d-dimensional space. ode provides the ability to integrate an
ordinary differential equation or a system of ordinary differential equations, when pro-
vided with an explicit expression for each equation. It supplements the plotting program
gnuplot, which can plot functions but not integrate ordinary differential equations. The
final command-line mathematical program, double, is a filter for converting, scaling and
cutting binary or ASCII data streams. It is still under development and is not yet docu-
mented.
The GNU libplot function library, on which the command-line graphics programs are
based, is discussed at length elsewhere in this documentation. It gives C and C++ programs
the ability to draw such objects as lines, open and closed polylines, arcs (both circular and
elliptic), quadratic and cubic Bezier curves, circles and ellipses, points (i.e., pixels), marker
symbols, and text strings. The filling of objects other than points, marker symbols, and
text strings is supported (fill color, as well as pen color, can be set arbitrarily). Text strings
can be drawn in any of a large number of fonts. The 35 standard Postscript fonts are
supported by the X Window System, SVG, Illustrator, Postscript, CGM, and xfig drivers,
and the 45 standard PCL 5 fonts are supported by the SVG, Illustrator, PCL 5 and HP-
GL/2 drivers. The latter two also support a number of Hewlett–Packard vector fonts. All
drivers, including the PNG, PNM, GIF, ReGIS, Tektronix and metafile drivers, support a
set of 22 Hershey vector fonts.
The support for drawing text strings is extensive. Text strings may include subscripts
and superscripts, and may include characters chosen from more than one font in a typeface.
Many non-alphanumeric characters may be included. The entire collection of over 1700
Chapter 1: The GNU Plotting Utilities 4
‘Hershey glyphs’ digitized by Allen V. Hershey at the U.S. Naval Surface Weapons Center,
which includes many curious symbols, is built into GNU libplot. Text strings in the so-
called EUC-JP encoding (the Extended Unix Code for Japanese) can be also be drawn.
Such strings may include both syllabic Japanese characters (Hiragana and Katakana) and
ideographic Japanese characters (Kanji). GNU libplot contains a library of 603 Kanji,
including 596 of the 2965 frequently used Level 1 Kanji.
Chapter 2: The graph Application 5
points will be taken to be regularly spaced along the abscissa. The two arguments following
‘-a’ on the command line will be taken as the sampling interval and the abscissa value of the
first data point. If they are absent, they default to 1.0 and 0.0 respectively. For example,
the command
echo 0 1 0 | graph -T ps -a > plot.ps
produces exactly the same plot as
echo 0 0 1 1 2 0 | graph -T ps > plot.ps
If the ‘-I e’ option is specified, graph will plot data with error bars. In this case the
dataset should consist of triples (x,y,error ), rather than pairs (x, y). A vertical error bar of
the appropriate length will be plotted at each data point. You would plot a symbol at each
data point, along with the error bar, by using the ‘-S’ option in the usual way. The symbol
will be the same for each point in the dataset. You may use the ‘-a’ option in conjunction
with ‘-I e’, if you wish. If you do, the dataset should contain no abscissa (i.e., x) values.
By default, the limits on the x and y axes, and the spacing between the labeled ticks on
each axis, are computed automatically. You may wish to set them manually. You would
accomplish this with the ‘-x’ and ‘-y’ options.
echo 0 0 1 1 2 0 | graph -T ps -x -1 3 -y -1 2 > plot.ps
will produce a plot in which the x axis extends from −1 to 3, and the y axis from −1 to 2.
By default, graph tries to place about six numbered ticks on each axis. By including an
optional third argument to ‘-x’ or ‘-y’, you may manually set the spacing of the labeled
ticks. For example, using ‘-y -1 2 1’ rather than ‘-y -1 2’ will produce a y axis with labeled
ticks at −1, 0, 1, and 2, rather than at the locations that graph would choose by default,
which would be −1, −0.5, 0, 0.5, 1, 1.5, and 2. In general, if a third argument is present
then labeled ticks will be placed at each of its integer multiples.
To make an axis logarithmic, you would use the ‘-l’ option. For example,
echo 1 1 2 3 3 1 | graph -T ps -l x > plot.ps
will produce a plot in which the x axis is logarithmic, but the y axis is linear. To make
both axes logarithmic, you would use ‘-l x -l y’. By default, the upper and lower limits
on a logarithmic axis are powers of ten, and there are tick marks at each power of ten and
at its integer multiples. The tick marks at the powers of ten are labeled. If the axis spans
more than five orders of magnitude, the tick marks at the integer multiples are omitted.
If you have an unusually short logarithmic axis, you may need to increase the number
of labeled ticks. To do this, you should specify a tick spacing manually. For example, ‘-l x
-x 1 9 2’ would produce a plot in which the x axis is logarithmic and extends from 1 to 9.
Labeled ticks would be located at each integer multiple of 2, i.e., at 2, 4, 6, and 8.
You would label the x and y axes with the ‘-X’ and ‘-Y’ options, respectively. For
example,
echo 1 1 2 3 3 1 | graph -T ps -l x -X "A Logarithmic Axis" > plot.ps
will label the log axis in the preceding example. By default, the label for the y axis (if any)
will be rotated 90 degrees, unless you use the ‘-Q’ option. (Some X Window System displays,
both old and new, do not properly support rotated labels, and require the ‘-Q’ option.) You
may specify a ‘top label’, or title for the plot, by using the ‘-L’ option. Doing, for example,
echo 1 1 2 3 3 1 | graph -T ps -l x -L "A Simple Example" > plot.ps
Chapter 2: The graph Application 9
Several command-line options specify sizes or dimensions as fractions of the size of the
plotting box. For example, ‘-S 3 .01’ specifies that the marker symbols for the following
dataset should be of type #3, and should have a font size equal to 0.01, i.e., 0.01 times
the minimum dimension (height or width) of the plotting box. If the ‘-h’ or ‘-w’ options
are employed to expand or contract the plot, such sizes or dimensions will scale in tandem.
That is presumably the right thing to do.
To rotate your plot by 90 degrees counterclockwise, you would add ‘--rotation 90’ to
the graph command line. You would specify ‘--rotation 180’ to produce an upside-down
plot. Any other angle may be specified, but angles other than 0, 90, 180, and 270 degrees
are of interest primarily to postmodernists. The ‘--rotation’ option may be combined
with the ‘-h’, ‘-w’, ‘-r’, and ‘-u’ options. If they appear together, the ‘--rotation’ option
takes effect first. That is because ‘--rotation’ specifies the rotation angle of the graphics
display, while the other options specify how the plotting box should be positioned within
the graphics display. The two sorts of positioning are logically distinct.
The graphics display (sometimes called the ‘viewport’) is an abstraction. For graph
-T X, it is a popped-up window on an X display. For graph -T pnm and graph -T gif, it is
a square or rectangular bitmap. In these three cases, the size of the graphics display can
be set by using the ‘--bitmap-size’ option, or by setting the BITMAPSIZE environment
variable. For graph -T tek, the graphics display is a square region occupying the central
part of a Tektronix display. (Tektronix displays are 4/3 times as wide as they are high.)
For graph -T regis, it is a square region occupying the central part of a ReGIS display.
For graph -T ai, graph -T ps, graph -T pcl, and graph -T fig, by default it is a 8-inch
square centered on an 8.5 in by 11 in page (US letter size). For graph -T hpgl, it is an
8-inch square, which by default is not centered. For graph -T svg and graph -T cgm, the
default graphics display is an 8-inch square, though if the output file is placed on a Web
page, it may be scaled arbitrarily.
The page size, which determines the default display size used by graph -T svg, graph
-T ai, graph -T ps, graph -T cgm, graph -T fig, graph -T pcl, and graph -T hpgl, can
be set by using the ‘--page-size’ option, or by setting the environment variable PAGESIZE.
For example, setting the page size to "a4" would produce output for an A4-size page (21 cm
by 29.7 cm), and would select a appropriate graphics display size. Either or both of the di-
mensions of the graphics display can be specified explicitly. For example, the page size could
be specified as "letter,xsize=4in", or "a4,xsize=10cm,ysize=15cm". The dimensions of the
graphics display are allowed to be negative (a negative dimension results in a reflection).
The position of the display on the page, relative to its default position, may optionally
be adjusted by specifying an offset vector. For example, the page size could be specified as
"letter,yoffset=1.2in", or "a4,xoffset=−5mm,yoffset=2.0cm". It is also possible to position
the graphics display precisely, by specifying the location of its lower left corner relative
to the lower left corner of the page. For example, the page size could be specified as
"letter,xorigin=2in,yorigin=3in", or "a4,xorigin=0.5cm,yorigin=0.5cm".
The preceding options may be intermingled. However, graph -T svg and graph -T cgm
ignore the "xoffset", "yoffset", "xorigin", and "yorigin" options, since SVG format and
WebCGM format have no notion of the Web page on which the graphics display will ul-
timately be positioned. They interpret the "xsize" and "ysize" options as specifying a
default size for the graphics display (it is merely a default, since the output file may be
scaled arbitrarily when it is placed on a Web page).
Chapter 2: The graph Application 11
For more information on page and graphics display sizes, see Appendix C [Page and
Viewport Sizes], page 167.
The dataset in file1 will be plotted in linemode #0, so successive points will not be joined
by lines. But symbol #3 (an asterisk) will be plotted at each point. The dataset in file2
will be plotted in color, and linemode #3 will be used. In color plotting, linemode #3 is
interpreted as a solid blue line. The second ‘-C’ on the command line turns off color for
file3. The points in the third dataset will be joined by a black line with thickness 0.02,
as a fraction of the size (i.e., minimum dimension) of the graphics display.
The above command line could be made even more complicated by specifying additional
options (e.g., ‘-q’ or ‘-I’) before each file. In fact the command line could also include such
standard options as ‘-x’ or ‘-y’, which specify the range of each axis. Such options, which
refer to the plot as a whole rather than to individual datasets, should appear before the
first file name. For example, you could do
graph -T ps -x 0 1 0.5 -m 0 -S 3 file1 -C -m 3 file2 > output.ps
Note that it is possible to include the special file name ‘-’, which refers to standard input,
on the command line. So you may pipe the output of another program into graph. You
may even generate a plot in part from piped output, and in part from files.
Each input file may include more than one dataset. If so, the command line options
preceding a file on the command line will take effect for all datasets in that file. There
are two exceptions to this. By default, the linemode is incremented (‘bumped’) from one
dataset to the next. This feature is usually quite convenient. For example, if you do
graph -T ps -m 3 file1 > output.ps
the first dataset in file1 will appear in linemode #3, the second in linemode #4, etc.
In fact, if you do
graph -T ps file1 file2 ... > output.ps
without specifying linemode explicitly, the successive datasets read from the files on the
command line will appear in linemode #1, linemode #2, . . . . If you do not like this feature,
you may turn it off, or in general toggle it, by using the ‘-B’ option.
You may also control manually the linemode and symbol type used for the datasets
within any file. You would do this by including directives in the file itself, rather than on
the command line. For example, if the line
#m=-5,S=10
appeared in an ASCII-format input file, it would be interpreted as a directive to switch to
linemode #−5 and symbol type #10 for the following dataset. Future releases of graph
may provide the ability to set each of the seven dataset attributes in this way.
#include <stdio.h>
void write_point (float x, float y)
{
fwrite(&x, sizeof (float), 1, stdout);
fwrite(&y, sizeof (float), 1, stdout);
}
You may plot data written this way by doing:
graph -T ps -I f < binary_datafile > plot.ps
The inclusion of multiple datasets within a single binary file is supported. If a binary file
contains more than a single dataset, successive datasets should be separated by a single
occurrence of the the largest possible number. For single precision datasets this is the
quantity FLT_MAX, for double precision datasets it is the quantity DBL_MAX, and for integer
datasets it is the quantity INT_MAX. On most machines FLT_MAX is approximately 3.4×1038 ,
DBL_MAX is approximately 1.8 × 10308 , and INT_MAX is 231 − 1.
If you are reading datasets from more than one file, it is not required that the files be
in the same format. For example,
graph -T ps -I f binary_datafile -I a ascii_datafile > plot.ps
will read binary_datafile in ‘f’ (binary single precision) format, and datafile in ‘a’
(normal ASCII) format.
There is currently no support for reading and plotting binary data with error bars. If
you have data with error bars, you should supply the data to graph in ASCII, and use the
‘-I e’ option.
graph can also read data files in the ASCII ‘table’ format produced by the gnuplot
plotting program. For this, you should use the ‘-I g’ option. Such a data file may consist
of more than one dataset.
To sum up: there are six supported data formats, ‘a’ (normal ASCII), ‘e’ (ASCII with
error bars), ‘g’ (the ASCII ‘table’ format produced by gnuplot), ‘f’ (binary single precision),
‘d’ (binary double precision), and ‘i’ (binary integer). Input files may be in any of these
six formats.
The following sections list the possible options. Each option that takes an argument is
followed, in parentheses, by the type and default value of the argument. There are five sorts
of option.
1. Options affecting an entire plot. (See Section 2.6.1 [Plot Options], page 15.)
2. Options affecting the reading and drawing of individual datasets within a plot. (See
Section 2.6.2 [Dataset Options], page 22.)
3. Options for multiplotting (drawing several plots at once). (See Section 2.6.3 [Multiplot
Options], page 26.)
4. Options relevant only to raw graph, i.e., relevant only if no output format is specified
with the ‘-T’ option. (See Section 2.6.4 [Raw graph Options], page 26.)
5. Options requesting information (e.g., ‘--help’). (See Section 2.6.5 [Info Options],
page 26.)
‘-T type’
‘--output-format type’
(String, default "meta".) Select an output format of type type, which may
be one of the strings "X", "png", "pnm", "gif", "svg", "ai", "ps", "cgm",
"fig", "pcl", "hpgl", "regis", "tek", and "meta". These refer respectively to
the X Window System, PNG format, portable anymap (PBM/PGM/PPM) for-
mat, pseudo-GIF format, the XML-based Scalable Vector Graphics format, the
format used by Adobe Illustrator, idraw-editable Postscript, the WebCGM for-
mat for Web-based vector graphics, the format used by the xfig drawing editor,
the Hewlett–Packard PCL 5 printer language, the Hewlett–Packard Graphics
Language (by default, HP-GL/2), the ReGIS (remote graphics instruction set)
format developed by DEC, Tektronix format, and device-independent GNU
graphics metafile format. The option ‘--display-type’ is an obsolete alterna-
tive to ‘--output-format’.
‘-E x|y’
‘--toggle-axis-end x|y’
Set the position of the indicated axis to be on the other end of the plotting box
from what is currently the case. E.g., ‘-E y’ will cause the y axis to appear on
the right of the plot rather than the left, which is the default. Similarly, ‘-E x’
will cause the x axis to appear at the top of the plot rather than the bottom.
Note that if the x axis appears at the top, no plot title will be drawn, since
there will be no room.
Chapter 2: The graph Application 16
‘-f size’
‘--font-size size’
(Float, default 0.0525.) Set the size of the font used for the axis and tick labels
to be size. The size is specified as a fraction of the minimum dimension (width
or height) of the plotting box.
‘-F font_name’
‘--font-name font_name’
(String, default "Helvetica" except for graph -T pcl, for which "Univers" is
the default, and graph -T png, graph -T pnm, graph -T gif, graph -T hpgl,
graph -T regis, graph -T tek, and raw graph, for all of which "HersheySerif"
is the default.) Set the font used for the axis and tick labels, and for the plot
title (if any), to be font name. The choice of font for the plot title may be
overridden with the ‘--title-font-name’ option (see below). Font names are
case-insensitive. If the specified font is not available, the default font will be
used. Which fonts are available depends on which ‘-T’ option is used. For a
list of all fonts, see Section A.1 [Text Fonts], page 144. The plotfont utility
will produce a character map of any available font. See Chapter 6 [plotfont],
page 56.
‘-g grid_style’
‘--grid-style grid_style’
(Integer in the range 0. . . 4, default 2.) Set the grid style for the plot to be
grid style. Grid styles 0 through 3 are progressively more fancy, but style 4 is
a somewhat different style.
0. no axes, tick marks or labels.
1. a pair of axes, with tick marks and labels.
2. box around plot, with tick marks and labels.
3. box around plot, with tick marks and labels; also grid lines.
4. axes intersect at the origin, with tick marks and labels.
‘-h height’
‘--height-of-plot height’
(Float, default 0.6.) Set the fractional height of the plot with respect to the
height of the display (or virtual display, in the case of a multiplot) to be height.
A value of 1.0 will produce a plotting box that fills the entire available area.
Since labels and tick marks may be placed outside the plotting box, values
considerably less than 1.0 are normally chosen.
‘-H’
‘--toggle-frame-on-top’
Toggle whether or not a copy of the plot frame should be drawn on top of the
plot, as well as beneath it. This option is useful when the plotted dataset(s)
project slightly beyond the frame, which can happen if a large line thickness or
symbol size is specified.
Chapter 2: The graph Application 17
‘-k length’
‘--tick-size length’
(Float, default .02.) Set the length of the tick marks on each axis to be length.
A value of 1.0 produces tick marks whose length is equal to the minimum di-
mension (width or height) of the plotting box. A negative length yields tick
marks that extend outside the box, rather than inside.
‘-K clip_mode’
‘--clip-mode clip_mode’
(Integer, default 1.) Set the clip mode for the plot to clip mode. The clip mode
is relevant only if data points are being joined by a line, and the line is not
being filled to create a filled region (since filled regions are clipped in a fixed
way).
There are three clip modes: 0, 1, and 2. They have the same meaning as in the
gnuplot plotting program. Clip mode 0 means that a line segment joining two
data points will be plotted only if neither point is outside the plotting box. Clip
mode 1 means that it will be plotted if no more than one of the two points is
outside, and clip mode 2 means that it will be plotted even if both are outside.
In all three clip modes the line segment will be clipped to the plotting box.
‘-l x|y’
‘--toggle-log-axis x|y’
Set the specified axis to be a log axis rather than a linear axis, or vice versa.
By default, both axes are linear axes.
‘-L top_label’
‘--top-label top_label’
(String, default empty.) Place the text string top label above the plot, as its
‘top label’, i.e., title. The string may include escape sequences (see Section A.4
[Text String Format], page 151). The ‘--title-font-size’ option may be
used to specify the size of the font. The font is normally the same as the font
used for labeling axes and ticks, as selected by the ‘-F’ option. But this can be
overridden with the ‘--title-font-name’ option.
‘-N x|y’
‘--toggle-no-ticks x|y’
Toggle the presence of ticks and tick labels on the specified axis. This applies
to the grid styles that normally include ticks and tick labels, i.e., grid styles 1,
2, 3, and 4.
‘-Q’
‘--toggle-rotate-y-label’
Position the label on the y axis (which is set with the ‘-Y’ option) horizontally
instead of vertically, or vice versa. By default, the label is rotated, so that it
is parallel to the y axis. But some output devices (e.g., old X Window System
displays, and buggy new ones) cannot handle rotated fonts. So if you specify
‘-T X’, you may also need ‘-Q’.
Chapter 2: The graph Application 18
‘-r right’
‘--right-shift right’
(Float, default 0.2.) Move the plot to the right by a fractional amount right with
respect to the width of the display (or virtual display, in the case of a multiplot).
This produces a margin on the left side of the plotting box. A value of 0.5 will
produce a margin half the width of the available area. Note that the tick marks
and labels are drawn in the margin.
‘-R x|y’
‘--toggle-round-to-next-tick x|y’
Toggle whether or not the upper and lower limits of the specified axis should be
expanded, so that they both become integer multiples of the spacing between
labeled tick marks.
This option is meaningful whenever the user specifies either or both of the limits,
by using the ‘-x’ or ‘-y’ option. If the user leaves both limits unspecified, they
will always be chosen to satisfy the ‘integer multiple’ constraint.
‘-s’
‘--save-screen’
Save the screen. This option requests that graph not erase the output device
before it begins to plot.
This option is relevant only to graph -T tek and raw graph. Tektronix displays
and emulators are persistent, in the sense that previously drawn graphics remain
visible. So by repeatedly using graph -T tek -s, you can build up a multiplot.
‘-t’
‘--toggle-transpose-axes’
Transpose the abscissa and ordinate. This causes the axes to be interchanged,
and the options that apply to each axis to be applied to the opposite axis. That
is, data points are read in as (y, x) pairs, and such options as ‘-x’ and ‘-X’ apply
to the y axis rather than the x axis. If the ‘-I e’ option is in force, so that the
data points are read with error bars, the orientation of the error bars will be
switched between vertical and horizontal.
‘-u up’
‘--upward-shift up’
(Float, default 0.2.) Move the plot up by a fractional amount up with respect
to the height of the display (or virtual display, in the case of a multiplot). This
produces a margin below the plotting box. A value of 0.5 will produce a margin
half the height of the available area. Note that the tick marks and labels are
drawn in the margin.
‘-w width’
‘--width-of-plot width’
(Float, default 0.6.) Set the fractional width of the plot with respect to the
width of the display (or virtual display, in the case of a multiplot) to be width.
A value of 1.0 will produce a plotting box that fills the entire available area.
Since labels and tick marks may be placed outside the plotting box, values
considerably less than 1.0 are normally chosen.
Chapter 2: The graph Application 19
[graph Environment], page 27. If the ‘-T svg’ or ‘-T cgm’ option is used, an
output file without a background may be produced by setting the background
color to "none".
‘--bitmap-size bitmap_size’
(String, default "570x570".) Set the size of the graphics display in which the
plot will be drawn, in terms of pixels, to be bitmap size. This is relevant
only to graph -T X, graph -T png, graph -T pnm, and graph -T gif, for all of
which the size can be expressed in terms of pixels. The environment variable
BITMAPSIZE may equally well be used to specify the size.
The graphics display used by graph -T X is a popped-up X window.
Command-line positioning of this window on an X Window System display is
supported. For example, if bitmap size is "570x570+0+0" then the window
will be popped up in the upper left corner.
If you choose a rectangular (non-square) window size, the fonts in the plot will
be scaled anisotropically, i.e., by different factors in the horizontal and vertical
direction. Any font that cannot easily be anisotropically scaled will be replaced
by a default scalable font, such as the Hershey vector font "HersheySerif".
For backward compatibility, graph -T X allows the user to set the window
size and position by setting the X resource Xplot.geometry, instead of
‘--bitmap-size’ or BITMAPSIZE.
‘--emulate-color option’
(String, default "no".) If option is "yes", replace each color in the output by
an appropriate shade of gray. This is seldom useful, except when using ‘graph
-T pcl’ to prepare output for a PCL 5 device. (Many monochrome PCL 5
devices, such as monochrome LaserJets, do a poor job of emulating color on
their own. They usually map HP-GL/2’s seven standard pen colors, including
even yellow, to black.) You may equally well request color emulation by setting
the environment variable EMULATE_COLOR to "yes".
‘--frame-color name’
(String, default "black".) Set the color used for drawing the plot frame, and
for drawing monochrome datasets (if any) to be name. An unrecognized name
sets the color to the default. For information on what names are recognized,
see Appendix B [Color Names], page 166.
‘--frame-line-width frame_line_width’
(Float, default −1.0.) Set the thickness of lines in the plot frame, as a fraction of
the size (i.e., minimum dimension) of the graphics display, to frame line width.
A negative value means that the default value for the line thickness provided
by the GNU libplot graphics library should be used. This is usually 1/850
times the size of the display, although if ‘-T X’, ‘-T png’, ‘-T pnm’, or ‘-T gif’
is specified, it is zero. By convention, a zero-thickness line is the thinnest line
that can be drawn. This is the case in all output formats. Note, however, that
the drawing editors idraw and xfig treat zero-thickness lines as invisible.
graph -T tek and graph -T regis do not support drawing lines with other
than a default thickness, and graph -T hpgl does not support doing so if the
environment variable HPGL_VERSION is set to a value less than "2" (the default).
Chapter 2: The graph Application 21
‘--max-line-length max_line_length’
(Integer, default 500.) Set the maximum number of points that a polygonal
line drawn through any dataset may contain, before it is flushed to the output
device, to equal max line length. If this flushing occurs, the polygonal line will
be split into two or more sub-lines, though the splitting should not be noticeable.
Splitting will not take place if the ‘-q’ option, which requests filling, is used.
The reason for splitting long polygonal lines is that some display devices (e.g.,
old Postscript printers and HP-GL pen plotters) have limited buffer sizes. The
environment variable MAX_LINE_LENGTH can also be used to specify the max-
imum line length. This option has no effect on graph -T tek or raw graph,
since they draw polylines in real time and have no buffer limitations.
‘--page-size pagesize’
(String, default "letter".) Set the size of the page on which the plot will be posi-
tioned. This is relevant only to graph -T svg, graph -T ai, graph -T ps, graph
-T cgm, graph -T fig, graph -T pcl, and graph -T hpgl. "letter" means an
8.5 in by 11 in page. Any ISO page size in the range "a0". . . "a4" or ANSI
page size in the range "a". . . "e" may be specified ("letter" is an alias for "a"
and "tabloid" is an alias for "b"). "legal", "ledger", and "b5" are recognized
page sizes also. The environment variable PAGESIZE can equally well be used
to specify the page size.
For graph -T ai, graph -T ps, graph -T pcl, and graph -T fig, the graph-
ics display (or ‘viewport’) within which the plot is drawn will be, by de-
fault, a square region centered on the specified page. For graph -T hpgl,
it will be a square region of the same size, but may be positioned differ-
ently. Either or both of the dimensions of the graphics display can be spec-
ified explicitly. For example, pagesize could be specified as "letter,xsize=4in",
or "a4,xsize=10cm,ysize=15cm". The dimensions are allowed to be negative
(a negative dimension results in a reflection).
The position of the graphics display, relative to its default position, may option-
ally be adjusted by specifying an offset vector. For example, pagesize could be
specified as "letter,yoffset=1.2in", or "a4,xoffset=−5mm,yoffset=2.0cm". It is
also possible to position the graphics display precisely, by specifying the loca-
tion of its lower left corner relative to the lower left corner of the page. For
example, pagesize could be specified as "letter,xorigin=2in,yorigin=3in", or
"a4,xorigin=0.5cm,yorigin=0.5cm". The preceding options may be intermin-
gled.
graph -T svg and graph -T cgm ignore the "xoffset", "yoffset", "xorigin", and
"yorigin" options, since SVG format and WebCGM format have no notion of the
Web page on which the graphics display will ultimately be positioned. However,
they do respect the "xsize" and "ysize" options. For more on page sizes, see
Appendix C [Page and Viewport Sizes], page 167.
‘--pen-colors colors’
(String, default "1=red:2=green:3=blue:4=magenta:5=cyan".) Set the colors
of the pens used for drawing plots, as numbered, to be colors. The format
should be self-explanatory. An unrecognized name sets the corresponding color
Chapter 2: The graph Application 22
to the default. For information on what names are recognized, see Appendix B
[Color Names], page 166.
‘--rotation angle’
(Integer, default 0.) Set the rotation angle of the graphics display to be angle
degrees. The rotation is counterclockwise. The environment variable ROTATION
can equally well be used to specify the rotation angle.
This option is used for switching between portrait and landscape orientations,
which have rotation angles 0 and 90 degrees respectively. Postmodernists may
also find it useful.
‘--title-font-name font_name’
(String, default "Helvetica" except for graph -T pcl, for which "Univers" is the
default, and graph -T png, graph -T pnm, graph -T gif, graph -T hpgl, graph
-T regis, and graph -T tek, for all of which "HersheySerif" is the default.) Set
the font used for the plot title to be font name. Normally the font used for the
plot title is the same as that used for labeling the axes and the ticks along the
axes, as specified by the ‘-F’ option. But the ‘--title-font-name’ option can
be used to override this. Font names are case-insensitive. If the specified font is
not available, the default font will be used. Which fonts are available depends
on which ‘-T’ option is used. For a list of all fonts, see Section A.1 [Text Fonts],
page 144. The plotfont utility will produce a character map of any available
font. See Chapter 6 [plotfont], page 56.
‘--title-font-size size’
(Float, default 0.07.) Set the size of the font used for the top label (‘title’), as
specified by the ‘-L’ option, to be size. The size is specified as a fraction of the
minimum dimension (width or height) of the plotting box.
‘g’ The ASCII ‘table’ format produced by the gnuplot plotting pro-
gram.
‘f’ Single precision binary format. Each input file is a sequence of
single precision floating point numbers, interpreted as forming pairs
(x,y). Successive datasets are separated by a single occurrence of
the quantity FLT_MAX, which is the largest possible single precision
floating point number. On most machines this is approximately
3.4 × 1038 .
‘d’ Double precision binary format. Each input file is a sequence of
double precision floating point numbers, interpreted as forming
pairs (x,y). Successive datasets are separated by a single occur-
rence of the quantity DBL_MAX, which is the largest possible double
precision floating point number. On most machines this is approx-
imately 1.8 × 10308 .
‘i’ Integer binary format. Each input file is a sequence of integers, in-
terpreted as forming pairs (x,y). Successive datasets are separated
by a single occurrence of the quantity INT_MAX, which is the largest
possible integer. On most machines this is 231 − 1.
‘-a [step_size [lower_limit]]’
‘--auto-abscissa [step_size [lower_limit]]’
(Floats, defaults 1.0 and 0.0.) Automatically generate abscissa (x) values. Ir-
respective of data format (‘a’, ‘e’, ‘f’, ‘d’, or ‘i’), this option specifies that the
abscissa (x) values are missing from the input file: the dataset(s) to be read
contain only ordinate (y) values. The increment from each x value to the next
will be step size, and the first x value will be lower limit. To return to reading
abscissa values from the input, i.e., for subsequent input files, you would use
‘-a 0’, which disables automatic generation of the abscissa values and returns
step size and lower limit to their default values.
‘-B’
‘--toggle-auto-bump’
By default, the linemode (set with ‘-m’, see below) is ‘bumped’ (incremented by
unity) at the beginning of each new dataset. This option toggles auto-bumping:
it turns it off if it was on, and on if it was off.
The following options affect the way in which individual datasets are drawn as part of
a plot. These options set the six ‘attributes’ (symbol type, symbol font, linemode, line
thickness, fill fraction, and color/monochrome) that each dataset has.
‘-m line_mode’
‘--line-mode line_mode’
(Integer, default 1.) line mode specifies the mode (i.e., style) of the lines drawn
between successive points in a dataset. By convention, linemode #0 means no
line at all (data points are disconnected). If the dataset is being rendered in
monochrome, the interpretation of line mode is as follows.
1. solid
Chapter 2: The graph Application 24
2. dotted
3. dotdashed
4. shortdashed
5. longdashed
Thereafter (i.e., for line mode greater than 5) the sequence of five linemodes
repeats. So besides linemode #0, there are a total of five distinct monochrome
linemodes. If the dataset is being rendered in color (as may be requested with
the ‘-C’ option), the interpretation of linemodes #1 through #5 is instead
1. red, solid
2. green, solid
3. blue, solid
4. magenta, solid
5. cyan, solid
Linemodes #6 through #10 use the same five colors, but are dotted; linemodes
#11 through #15 are dotdashed; linemodes #16 through #20 are shortdashed;
and linemodes #21 through #25 are longdashed. So besides linemode #0, there
are a total of 25 distinct colored linemodes. A negative linemode indicates that
no line should be drawn, but that the marker symbol, if any (see below), should
be in the color of the corresponding positive linemode.
‘-S [symbol_number [symbol_size]]’
‘--symbol [symbol_number [symbol_size]]’
(Integer and float, defaults 0 and 0.03.) Draw a marker symbol at each data
point. symbol number specifies the symbol type, and symbol size specifies
the font size of the symbol, as a fraction of the minimum dimension (width or
height) of the plotting box. If the dataset is being rendered in color, the symbol
will have the color of the line that is being drawn to connect the data points.
If you use the ‘-S’ option, you would usually also use the ‘-m’ option, to request
that the symbols be drawn without any line connecting them. By specifying
a negative argument to ‘-m’ (a ‘negative linemode’), you may obtain colored
symbols.
The following table lists the first few symbols (by convention, symbol #0 means
no symbol at all).
1. dot ( · )
2. plus (+)
3. asterisk (∗)
4. circle (◦)
5. cross (×)
Marker symbols 0. . . 31 are furnished by the GNU libplot graphics library.
See Section A.5 [Marker Symbols], page 163. Symbol numbers greater than or
equal to 32 are interpreted as characters in a symbol font, which can be set
with the ‘--symbol-font-name’ option (see below).
Chapter 2: The graph Application 25
‘-W line_width’
‘--line-width line_width’
(Float, default −1.0.) Set the thickness of the lines used to join successive points
in a dataset, as a fraction of the size (i.e., minimum dimension) of the graphics
display, to line width. A negative value means that the default value for the
line thickness provided by the GNU libplot graphics library should be used.
This is usually 1/850 times the size of the display, although if ‘-T X’, ‘-T png’,
‘-T pnm’, or ‘-T gif’ is specified, it is zero. By convention, a zero-thickness line
is the thinnest line that can be drawn. This is the case in all output formats.
Note, however, that the drawing editors idraw and xfig treat zero-thickness
lines as invisible.
graph -T tek and graph -T regis do not support drawing lines with other
than a default thickness, and graph -T hpgl does not support doing so if the
environment variable HPGL_VERSION is set to a value less than "2" (the default).
‘-q fill_fraction’
‘--fill-fraction fill_fraction’
(Float, default −1.0.) If successive points in a dataset are joined by line seg-
ments, set the shading intensity for the polygon formed by the line segments
to be fill fraction. A solid polygon (i.e., one filled with the ‘pen color’ used
for drawing the line segments) is obtained by choosing fill fraction=1.0. The
interior of the polygon will be white if fill fraction=0.0. The polygon will be
unfilled (transparent) if fill fraction is negative.
If the polygon intersects itself, the ‘even-odd fill rule’ will normally be used to
determine which points are inside rather than outside, i.e., to determine which
portions of the polygon should be shaded. The even-odd fill rule is explained
in the Postscript Language Reference Manual.
The ‘-q’ option has no effect on graph -T tek, and it is only partly effective in
graph -T hpgl if the environment variable HPGL_VERSION is set to a value less
than "2" (the default).
‘-C’
‘--toggle-use-color’
Toggle between color and monochrome rendering of datasets. The interpreta-
tion of linemode depends on whether the rendering is being performed in color
or monochrome; see the ‘-m’ option above.
‘--symbol-font-name symbol_font_name’
(String, default "ZapfDingbats" unless ‘-T png’, ‘-T pnm’, ‘-T gif’, ‘-T pcl’,
‘-T hpgl’, ‘-T regis’, or -T tek is specified, in which case it is "HersheySerif".)
Set the symbol font, from which marker symbols numbered 32 and higher are
selected, to be symbol font name. Font names are case-insensitive. If the speci-
fied font is not available, the default font will be used. Which fonts are available
depends on which ‘-T’ option is used. For example, if the ‘-T pcl’ or ‘-T hpgl’
option is used then normally the Wingdings font, which is an alternative source
of symbols, becomes available. For a list of all fonts, see Section A.1 [Text
Fonts], page 144. The plotfont utility will produce a character map of any
available font. See Chapter 6 [plotfont], page 56.
Chapter 2: The graph Application 26
graph -T hpgl support the 45 standard PCL 5 fonts, and graph -T pcl and
graph -T hpgl support a number of Hewlett–Packard vector fonts. All of the
preceding, together with graph -T png, graph -T pnm, graph -T gif, graph -T
regis, and graph -T tek, support a set of 22 Hershey vector fonts. Raw graph
in principle supports any of these fonts, since its output must be translated to
other formats with plot. The plotfont utility will produce a character map
of any available font. See Chapter 6 [plotfont], page 56.
‘--list-fonts’
Like ‘--help-fonts’, but lists the fonts in a single column to facilitate piping
to other programs. If no output format is specified with the ‘-T’ option, the
full set of supported fonts is listed.
‘--version’
Print the version number of graph and the plotting utilities package, and exit.
PCL 5 output for a color printer or other color device. This will ensure accurate color
reproduction by giving the output device complete freedom in assigning colors, internally,
to its “logical pens”. If it is "no" then the device will use a fixed set of colored pens, and will
emulate other colors by shading. The default is "no" because monochrome PCL 5 devices,
which are more common than colored ones, must use shading to emulate color.
graph -T hpgl, which produces Hewlett–Packard Graphics Language output, is also
affected by several environment variables. The most important is HPGL_VERSION, which
may be set to "1", "1.5", or "2" (the default). "1" means that the output should be generic
HP-GL, "1.5" means that the output should be suitable for the HP7550A graphics plotter
and the HP758x, HP7595A and HP7596A drafting plotters (HP-GL with some HP-GL/2
extensions), and "2" means that the output should be modern HP-GL/2. If the version is
"1" or "1.5" then the only available fonts will be vector fonts, and all lines will be drawn
with a default thickness (the ‘-W’ option will not work). Additionally, if the version is "1"
then the filling of arbitrary curves with solid color will not be supported (the ‘-q’ option
may be used to fill circles and rectangles aligned with the coordinate axes, though).
The position of the graph -T hpgl graphics display on the page can be rotated 90 degrees
counterclockwise by setting the HPGL_ROTATE environment variable to "yes". This is not
the same as the rotation obtained with the ‘--rotation’ option, since it both rotates the
graphics display and repositions its lower left corner toward another corner of the page.
Besides "no" and "yes", recognized values for the HPGL_ROTATE variable are "0", "90",
"180", and "270". "no" and "yes" are equivalent to "0" and "90", respectively. "180" and
"270" are supported only if HPGL_VERSION is "2" (the default).
Opaque filling and the drawing of visible white lines are supported only if HPGL_VERSION
is "2" (the default) and the environment variable HPGL_OPAQUE_MODE is "yes" (the default).
If the value is "no" then opaque filling will not be used, and white lines (if any), which
are normally drawn with pen #0, will not be drawn. This feature is to accommodate older
HP-GL/2 devices. HP-GL/2 pen plotters, for example, do not support opacity or the use
of pen #0 to draw visible white lines. Some older HP-GL/2 devices reportedly malfunction
if asked to draw opaque objects.
By default, graph -T hpgl will draw with a fixed set of pens. Which pens are present
may be specified by setting the HPGL_PENS environment variable. If HPGL_VERSION is "1",
the default value of HPGL_PENS is "1=black"; if HPGL_VERSION is "1.5" or "2", the default
value of HPGL_PENS is "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan".
The format should be self-explanatory. By setting HPGL_PENS, you may specify a color for
any pen in the range #1. . . #31. For information on what color names are recognized, see
Appendix B [Color Names], page 166. Pen #1 must always be present, though it need not
be black. Any pen in the range #2. . . #31 may be omitted.
If HPGL_VERSION is "2" then graph -T hpgl will also be affected by the environment
variable HPGL_ASSIGN_COLORS. If the value of this variable is "yes", then graph -T hpgl
will not be restricted to the palette specified in HPGL_PENS: it will assign colors to “logical
pens” in the range #1. . . #31, as needed. The default value is "no" because other than color
LaserJet printers and DesignJet plotters, not many HP-GL/2 devices allow the assignment
of colors to logical pens. In particular, HP-GL/2 pen plotters do not.
graph -T tek, which produces output for a Tektronix terminal or emulator, checks the
TERM environment variable. If the value of TERM is a string beginning with "xterm", "nx-
term", or "kterm", it is taken as a sign that graph is running in an X Window System
Chapter 2: The graph Application 29
VT100 terminal emulator: an xterm, nxterm, or kterm. Before drawing graphics, graph -T
tek will emit an escape sequence that causes the terminal emulator’s auxiliary Tektronix
window, which is normally hidden, to pop up. After the graphics are drawn, an escape
sequence that returns control to the original VT100 window will be emitted. The Tektronix
window will remain on the screen.
If the value of TERM is a string beginning with "kermit", "ansi.sys", or "nansi.sys",
it is taken as a sign that graph is running in the VT100 terminal emulator provided by
the MS-DOS version of kermit. Before drawing graphics, graph -T tek will emit an es-
cape sequence that switches the terminal emulator to Tektronix mode. Also, some of the
Tektronix control codes emitted by graph -T tek will be kermit-specific. There will be a
limited amount of color support, which is not normally the case (the 16 ansi.sys colors
will be supported). After drawing graphics, graph -T tek will emit an escape sequence
that returns the emulator to VT100 mode. The key sequence ‘ALT minus’ can be employed
manually within kermit to switch between the two modes.
Chapter 3: The plot Program 30
"fig", "pcl", "hpgl", "regis", "tek", and "meta". These refer respectively to
the X Window System, PNG format, portable anymap (PBM/PGM/PPM) for-
mat, pseudo-GIF format, the XML-based Scalable Vector Graphics format, the
format used by Adobe Illustrator, idraw-editable Postscript, the WebCGM for-
mat for Web-based vector graphics, the format used by the xfig drawing editor,
the Hewlett–Packard PCL 5 printer language, the Hewlett–Packard Graphics
Language (by default, HP-GL/2), the ReGIS (remote graphics instruction set)
format developed by DEC, Tektronix format, and device-independent GNU
graphics metafile format. The option ‘--display-type’ is an obsolete alterna-
tive to ‘--output-format’.
‘-p n’
‘--page-number n’
(Positive integer.) Display only page number n, within the metafile or sequence
of metafiles that is being translated.
Metafiles may consist of one or more pages, numbered beginning with 1. Also,
each page may contain multiple ‘frames’. plot -T X, plot -T regis, or plot -T
tek, which plot in real time, will separate successive frames by screen erasures.
plot -T png, plot -T pnm, plot -T gif, plot -T svg, plot -T ai, plot -T ps,
plot -T cgm, plot -T fig, plot -T pcl, plot -T hpgl, which do not plot in
real time, will display only the last frame of any multi-frame page.
The default behavior, if ‘-p’ is not used, is to display all pages. For example,
plot -T X displays each page in its own X window. If the ‘-T png’ option, the
‘-T pnm’ option, the ‘-T gif’ option, the ‘-T svg’ option, the ‘-T ai’ option, or
the ‘-T fig’ option is used, the default behavior is to display only the first page,
since files in PNG, PNM, pseudo-GIF, SVG, AI, or Fig format may contain only
a single page of graphics.
Most metafiles produced by the GNU plotting utilities (e.g., by raw graph)
contain only a single page, consisting of two frames: an empty one to clear the
display, and a second one containing graphics.
‘-s’
‘--merge-pages’
Merge all displayed pages into a single page, and also merge all ‘frames’ within
each displayed page.
This option is useful when merging together single-page plots from different
sources. For example, it can be used to merge together plots obtained from
separate invocations of graph. This is an alternative form of multiplotting (see
Section 2.4 [Multiplotting], page 12).
‘--bitmap-size bitmap_size’
(String, default "570x570".) Set the size of the graphics display in which the
plot will be drawn, in terms of pixels, to be bitmap size. This is relevant only
to plot -T X, plot -T png, plot -T pnm, and plot -T gif, for all of which the
size can be expressed in terms of pixels. The environment variable BITMAPSIZE
may equally well be used to specify the size.
The graphics display used by plot -T X is a popped-up X window.
Command-line positioning of this window on an X Window System display is
Chapter 3: The plot Program 33
The position of the graphics display, relative to its default position, may option-
ally be adjusted by specifying an offset vector. For example, pagesize could be
specified as "letter,yoffset=1.2in", or "a4,xoffset=−5mm,yoffset=2.0cm". It is
also possible to position the graphics display precisely, by specifying the loca-
tion of its lower left corner relative to the lower left corner of the page. For
example, pagesize could be specified as "letter,xorigin=2in,yorigin=3in", or
"a4,xorigin=0.5cm,yorigin=0.5cm". The preceding options may be intermin-
gled.
plot -T svg and plot -T cgm ignore the "xoffset", "yoffset", "xorigin", and
"yorigin" options, since SVG format and WebCGM format have no notion
of the Web page on which the graphics display will ultimately be positioned.
However, they do respect the "xsize" and "ysize" options. For more on page
sizes, see Appendix C [Page and Viewport Sizes], page 167.
The following options set the initial values of additional drawing parameters. Any of
these may be overridden by a directive in the metafile itself. In fact, these options are useful
only when plotting old metafiles in the pre-GNU ‘plot(5)’ format, which did not include
such directives.
‘--bg-color name’
(String, default "white".) Set the color used for the plot background to be
name. This is relevant only to plot -T X, plot -T png, plot -T pnm, plot -T
gif, plot -T cgm, plot -T regis, and plot -Tmeta. An unrecognized name
sets the color to the default. For information on what names are recognized,
see Appendix B [Color Names], page 166. The environment variable BG_COLOR
can equally well be used to specify the background color.
If the ‘-T png’ or ‘-T gif’ option is used, a transparent PNG file or a transparent
pseudo-GIF, respectively, may be produced by setting the TRANSPARENT_COLOR
environment variable to the name of the background color. See Section 3.3 [plot
Environment], page 36. If the ‘-T svg’ or ‘-T cgm’ option is used, an output
file without a background may be produced by setting the background color to
"none".
‘-f font_size’
‘--font-size font_size’
(Float, initial value device-dependent.) Set the initial size of the font used for
rendering text, as a fraction of the width of the graphics display, to font size.
‘-F font_name’
‘--font-name font_name’
(String, default "Helvetica" except for plot -T pcl, for which "Univers" is
the default, and plot -T png, plot -T pnm, plot -T gif, plot -T hpgl, plot
-T regis, plot -T tek, and raw plot, for all of which "HersheySerif" is the
default.) Set the font initially used for text (i.e., for ‘labels’) to font name. Font
names are case-insensitive. If the specified font is not available, the default font
will be used. Which fonts are available depends on which ‘-T’ option is used. For
a list of all fonts, see Section A.1 [Text Fonts], page 144. The plotfont utility
will produce a character map of any available font. See Chapter 6 [plotfont],
page 56.
Chapter 3: The plot Program 35
‘-W line_width’
‘--line-width line_width’
(Float, default −1.0.) Set the thickness of lines, as a fraction of the size (i.e.,
minimum dimension) of the graphics display, to line width. A negative value
means that the default value provided by the GNU libplot graphics library
should be used. This is usually 1/850 times the size of the display, although if
‘-T X’, ‘-T png’, ‘-T pnm’, or ‘-T gif’ is specified, it is zero. By convention, a
zero-thickness line is the thinnest line that can be drawn. This is the case in
all output formats. Note, however, that the drawing editors idraw and xfig
treat zero-thickness lines as invisible.
plot -T tek and plot -T regis do not support drawing lines with other than
a default thickness, and plot -T hpgl does not support doing so if the environ-
ment variable HPGL_VERSION is set to a value less than "2" (the default).
‘--pen-color name’
(String, default "black".) Set the pen color to be name. An unrecognized name
sets the pen color to the default. For information on what color names are
recognized, see Appendix B [Color Names], page 166.
The following option is relevant only to raw plot, i.e., relevant only if no output type is
specified with the ‘-T’ option. In this case plot outputs a graphics metafile, which may be
translated to other formats by a second invocation of plot.
‘-O’
‘--portable-output’
Output the portable (human-readable) version of GNU metafile format, rather
than a binary version (the default). This can also be requested by setting the
environment variable META_PORTABLE to "yes".
plot will automatically determine which type of GNU metafile format the input is in.
There are two types: binary (the default) and portable (human-readable). The binary
format is machine-dependent. See Appendix D [Metafiles], page 169.
For compatibility with older plotting software, the reading of input files in the pre-GNU
‘plot(5)’ format is also supported. This is normally a binary format, with each integer
in the metafile represented as a pair of bytes. The order of the two bytes is machine
dependent. You may specify that input file(s) are in plot(5) format rather than ordinary
GNU metafile format by using either the ‘-h’ option (“high byte first”) or the ‘-l’ option
(“low byte first”), whichever is appropriate. Some non-GNU systems support an ASCII
(human-readable) variant of plot(5) format. You may specify that the input is in this
format by using the ‘-A’ option. Irrespective of the variant, a file in plot(5) format includes
only one page of graphics.
‘-h’
‘--high-byte-first-input’
Input file(s) are assumed to be in traditional ‘plot(5)’ metafile format, with the
high-order byte of each integer occurring first. This variant is uncommon.
Chapter 3: The plot Program 36
‘-l’
‘--low-byte-first-input’
Input file(s) are assumed to be in traditional ‘plot(5)’ metafile format, with the
low-order byte of each integer occurring first. This variant is the most common.
‘-A’
‘--ascii-input’
Input file(s) are assumed to be in the ASCII variant of traditional ‘plot(5)’
metafile format. This variant is rare: on some older systems, it is produced by
a program called plottoa.
The following options request information.
‘--help’ Print a list of command-line options, and then exit.
‘--help-fonts’
Print a table of available fonts, and then exit. The table will depend on which
output format is specified with the ‘-T’ option. plot -T X, plot -T svg, plot
-T ai, plot -T ps, plot -T cgm, and plot -T fig each support the 35 stan-
dard Postscript fonts. plot -T svg, plot -T ai, plot -T pcl, and plot -T
hpgl support the 45 standard PCL 5 fonts, and plot -T pcl and plot -T hpgl
support a number of Hewlett–Packard vector fonts. All of the preceding, to-
gether with plot -T png, plot -T pnm, plot -T gif, plot -T regis, and plot
-T tek, support a set of 22 Hershey vector fonts. Raw plot in principle sup-
ports any of these fonts, since its output must be translated to other formats
with plot. The plotfont utility will produce a character map of any available
font. See Chapter 6 [plotfont], page 56.
‘--list-fonts’
Like ‘--help-fonts’, but lists the fonts in a single column to facilitate piping
to other programs. If no output format is specified with the ‘-T’ option, the
full set of supported fonts is listed.
‘--version’
Print the version number of plot and the plotting utilities package, and exit.
will be treated as transparent by most applications. For information on what color names
are recognized, see Appendix B [Color Names], page 166.
plot -T pnm, which produces output in Portable Anymap (PBM/PGM/PPM) format,
is affected by the PNM_PORTABLE environment variable. If its value is "yes", the output file
will be in the portable (human readable) version of PBM, PGM, or PPM format, rather
than the default (binary) version.
plot -T cgm, which produces CGM files that comply with the WebCGM profile for Web-
based vector graphics, is affected by two environment variables. By default, a version 3
CGM file is generated. Many older CGM interpreters and viewers, such as the ones built
into Microsoft Office and other commercial software, only support version 1 CGM files. The
CGM_MAX_VERSION environment variable may be set to "1", "2", "3", or "4" (the default) to
specify a maximum value for the version number. The CGM_ENCODING variable may also be
set, to specify the type of encoding used in the CGM file. Supported values are "clear text"
(i.e., human readable) and "binary" (the default). The WebCGM profile requires that the
binary encoding be used.
plot -T pcl, which produces PCL 5 output for Hewlett–Packard printers, is affected by
the environment variable PCL_ASSIGN_COLORS. It should be set to "yes" when producing
PCL 5 output for a color printer or other color device. This will ensure accurate color
reproduction by giving the output device complete freedom in assigning colors, internally,
to its “logical pens”. If it is "no" then the device will use a fixed set of colored pens, and will
emulate other colors by shading. The default is "no" because monochrome PCL 5 devices,
which are more common than colored ones, must use shading to emulate color.
plot -T hpgl, which produces Hewlett–Packard Graphics Language output, is also af-
fected by several environment variables. The most important is HPGL_VERSION, which may
be set to "1", "1.5", or "2" (the default). "1" means that the output should be generic HP-
GL, "1.5" means that the output should be suitable for the HP7550A graphics plotter and
the HP758x, HP7595A and HP7596A drafting plotters (HP-GL with some HP-GL/2 exten-
sions), and "2" means that the output should be modern HP-GL/2. If the version is "1"
or "1.5" then the only available fonts will be vector fonts, and all lines will be drawn with
a default thickness (the ‘-W’ option will not work). Additionally, if the version is "1" then
the filling of arbitrary curves with solid color will not be supported (circles and rectangles
aligned with the coordinate axes may be filled, though).
The position of the plot -T hpgl graphics display on the page can be rotated 90 degrees
counterclockwise by setting the HPGL_ROTATE environment variable to "yes". This is not
the same as the rotation obtained with the ‘--rotation’ option, since it both rotates the
graphics display and repositions its lower left corner toward another corner of the page.
Besides "no" and "yes", recognized values for the HPGL_ROTATE variable are "0", "90",
"180", and "270". "no" and "yes" are equivalent to "0" and "90", respectively. "180" and
"270" are supported only if HPGL_VERSION is "2" (the default).
Opaque filling and the drawing of visible white lines are supported only if HPGL_VERSION
is "2" (the default) and the environment variable HPGL_OPAQUE_MODE is "yes" (the default).
If the value is "no" then opaque filling will not be used, and white lines (if any), which
are normally drawn with pen #0, will not be drawn. This feature is to accommodate older
HP-GL/2 devices. HP-GL/2 pen plotters, for example, do not support opacity or the use
of pen #0 to draw visible white lines. Some older HP-GL/2 devices reportedly malfunction
if asked to draw opaque objects.
Chapter 3: The plot Program 38
By default, plot -T hpgl will draw with a fixed set of pens. Which pens are present may
be specified by setting the HPGL_PENS environment variable. If HPGL_VERSION is "1", the
default value of HPGL_PENS is "1=black"; if HPGL_VERSION is "1.5" or "2", the default value
of HPGL_PENS is "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan". The for-
mat should be self-explanatory. By setting HPGL_PENS, you may specify a color for any
pen in the range #1. . . #31. For information on what color names are recognized, see
Appendix B [Color Names], page 166. Pen #1 must always be present, though it need not
be black. Any pen in the range #2. . . #31 may be omitted.
If HPGL_VERSION is "2" then plot -T hpgl will also be affected by the environment
variable HPGL_ASSIGN_COLORS. If the value of this variable is "yes", then plot -T hpgl
will not be restricted to the palette specified in HPGL_PENS: it will assign colors to “logical
pens” in the range #1. . . #31, as needed. The default value is "no" because other than color
LaserJet printers and DesignJet plotters, not many HP-GL/2 devices allow the assignment
of colors to logical pens. In particular, HP-GL/2 pen plotters do not.
plot -T tek, which produces output for a Tektronix terminal or emulator, checks the
TERM environment variable. If the value of TERM is a string beginning with "xterm", "nx-
term", or "kterm", it is taken as a sign that plot is running in an X Window System VT100
terminal emulator: an xterm, nxterm, or kterm. Before drawing graphics, plot -T tek will
emit an escape sequence that causes the terminal emulator’s auxiliary Tektronix window,
which is normally hidden, to pop up. After the graphics are drawn, an escape sequence
that returns control to the original VT100 window will be emitted. The Tektronix window
will remain on the screen.
If the value of TERM is a string beginning with "kermit", "ansi.sys", or "nansi.sys", it is
taken as a sign that plot is running in the VT100 terminal emulator provided by the MS-
DOS version of kermit. Before drawing graphics, plot -T tek will emit an escape sequence
that switches the terminal emulator to Tektronix mode. Also, some of the Tektronix control
codes emitted by plot -T tek will be kermit-specific. There will be a limited amount of
color support, which is not normally the case (the 16 ansi.sys colors will be supported).
After drawing graphics, plot -T tek will emit an escape sequence that returns the emulator
to VT100 mode. The key sequence ‘ALT minus’ can be employed manually within kermit
to switch between the two modes.
Chapter 4: The pic2plot Program 39
direction, which at startup is left-to-right. The ‘up’ command changes this direction to
bottom-to-top, so that the next object (the arrow extending from the top of the big circle)
will point upward rather than to the right.
Objects have sizes and other attributes, which may be set globally, or specified on a
per-object basis. For example, the diameter of a circle may be specified, or the radius of
an arc. An arc may be oriented clockwise rather than counterclockwise by specifying the
‘cw’ attribute. The line style of most objects may be altered by specifying the ‘dashed’ or
‘dotted’ attribute. Also, any object may be labeled, by specifying one or more text strings
as attributes. A text string may contain escape sequences that shift the font, append
subscripts or superscripts, or include non-ASCII characters and mathematical symbols. See
Section A.4 [Text String Format], page 151.
Most sizes and positions are expressed in terms of ‘virtual inches’. The use of virtual
inches is peculiar to pic2plot. The graphics display used by pic2plot, i.e., its drawing
region, is defined to be a square, 8 virtual inches wide and 8 virtual inches high. If the page
size for the output file is the "letter" size, which is the default for Postscript output, virtual
inches will the same as real inches. But a different page size may be specified; for example,
by using the ‘--page-size a4’ option. If so, a virtual inch will simply equal one-eighth of
the width of the graphics display. On A4 paper, the graphics display is a square of size
19.81 cm.
By default, each figure is centered in the graphics display. You may turn off centering,
so that you can use absolute coordinates, by using the ‘-n’ option. For example, a figure
consisting only of the object ‘arrow from (8,8) to (4,4)’ will be positioned in the absence
of centering so that the head of the arrow is at the center of the display. Its tail will be at
the upper right corner.
The thickness of lines is not specified in terms of virtual inches. For compatibility with
gpic, it is specified in terms of virtual points. The example above, which specifies the
‘thickness’ attribute of one of the objects, illustrates this. There are 72 virtual points per
virtual inch.
If there is more than one figure to be displayed, they will appear in different X windows,
or on successive pages of the output file. Some output formats (such as PNG, PNM, pseudo-
GIF, SVG, Illustrator, and Fig) support only a single page of graphics. If any of those output
formats is chosen, only the first figure will appear in the output file. Currently, pic2plot
cannot produce animated pseudo-GIFs.
The preceding survey does not do justice to the pic language, which is actually a full-
featured programming language, with support for variables, looping constructs, etc. Its
advanced features make the drawing of large, repetitive diagrams quite easy.
standard output, unless the ‘-T X’ option is specified. In that case the output is displayed
in one or more windows on an X Window System display, and there is no output file.
The full set of command-line options is listed below. There are three sorts of option:
1. General options.
2. Options relevant only to raw pic2plot, i.e., relevant only if no output format is specified
with the ‘-T’ option.
3. Options requesting information (e.g., ‘--help’).
Each option that takes an argument is followed, in parentheses, by the type and default
value of the argument.
The following are general options.
‘-T type’
‘--output-format type’
(String, default "meta".) Select an output format of type type, which may
be one of the strings "X", "png", "pnm", "gif", "svg", "ai", "ps", "cgm",
"fig", "pcl", "hpgl", "regis", "tek", and "meta". These refer respectively to
the X Window System, PNG format, portable anymap (PBM/PGM/PPM) for-
mat, pseudo-GIF format, the XML-based Scalable Vector Graphics format, the
format used by Adobe Illustrator, idraw-editable Postscript, the WebCGM for-
mat for Web-based vector graphics, the format used by the xfig drawing editor,
the Hewlett–Packard PCL 5 printer language, the Hewlett–Packard Graphics
Language (by default, HP-GL/2), the ReGIS (remote graphics instruction set)
format developed by DEC, Tektronix format, and device-independent GNU
graphics metafile format. The option ‘--display-type’ is an obsolete alterna-
tive to ‘--output-format’.
‘-d’
‘--precision-dashing’
Draw dashed and dotted lines carefully, i.e., draw each dash and dot as a
separately positioned object. The default is to use the support for dashed and
dotted lines provided by the underlying graphics library, GNU libplot.
This option may produce slightly better-looking dashed and dotted lines. How-
ever, it will come at a price: if an editable output file is produced (i.e., an output
file in Illustrator, Postscript or Fig format), it will be difficulty to modify its
dashed and dotted lines with a drawing editor.
‘-f font_size’
‘--font-size font_size’
(Float, default 0.0175.) Set the size of the font used for rendering text, as a
fraction of the width of the graphics display, to font size.
‘-F font_name’
‘--font-name font_name’
(String, default "Helvetica" except for pic2plot -T pcl, for which "Univers"
is the default, and pic2plot -T png, pic2plot -T pnm, pic2plot -T gif,
pic2plot -T hpgl, pic2plot -T regis, pic2plot -T tek, and raw pic2plot,
for all of which "HersheySerif" is the default.) Set the font used for text
Chapter 4: The pic2plot Program 42
to font name. Font names are case-insensitive. If the specified font is not
available, the default font will be used. Which fonts are available depends on
which ‘-T’ option is used. For a list of all fonts, see Section A.1 [Text Fonts],
page 144. The plotfont utility will produce a character map of any available
font. See Chapter 6 [plotfont], page 56.
‘-n’
‘--no-centering’
Turn off the automatic centering of each figure. If this option is specified, the
position of the objects in each figure may be specified in terms of absolute
coordinates. E.g., ‘line from (0,0) to (4,4)’ will draw a line segment from
the lower left corner to the center of the graphics display, since the display
width and display height are defined to equal 8 virtual inches.
‘-W line_width’
‘--line-width line_width’
(Float, default −1.0.) Set the default thickness of lines, as a fraction of the size
(i.e., minimum dimension) of the graphics display, to line width. A negative
value means that the default value provided by the GNU libplot graphics
library should be used. This is usually 1/850 times the size of the display,
although if ‘-T X’, ‘-T png’, ‘-T pnm’, or ‘-T gif’ is specified, it is zero. By
convention, a zero-thickness line is the thinnest line that can be drawn. This is
the case in all output formats. Note, however, that the drawing editors idraw
and xfig treat zero-thickness lines as invisible.
pic2plot -T hpgl does not support drawing lines with other than a default
thickness if the environment variable HPGL_VERSION is set to a value less
than "2" (the default).
‘--bg-color name’
(String, default "white".) Set the color used for the background to be name.
This is relevant only to pic2plot -T X, pic2plot -T png, pic2plot -T pnm,
pic2plot -T gif, pic2plot -T cgm, pic2plot -T regis, and pic2plot -T
meta. An unrecognized name sets the color to the default. For information
on what names are recognized, see Appendix B [Color Names], page 166.
The environment variable BG_COLOR can equally well be used to specify the
background color.
If the ‘-T png’ or ‘-T gif’ option is used, a transparent PNG file or a transparent
pseudo-GIF, respectively, may be produced by setting the TRANSPARENT_COLOR
environment variable to the name of the background color. See Section 4.3
[pic2plot Environment], page 45. If the ‘-T svg’ or ‘-T cgm’ option is used, an
output file without a background may be produced by setting the background
color to "none".
‘--bitmap-size bitmap_size’
(String, default "570x570".) Set the size of the graphics display in which the
plot will be drawn, in terms of pixels, to be bitmap size. This is relevant only
to pic2plot -T X, pic2plot -T png, pic2plot -T pnm, and pic2plot -T gif,
for all of which the size can be expressed in terms of pixels. The environment
variable BITMAPSIZE may equally well be used to specify the size.
Chapter 4: The pic2plot Program 43
producing PCL 5 output for a color printer or other color device. This will ensure accurate
color reproduction by giving the output device complete freedom in assigning colors, inter-
nally, to its “logical pens”. If it is "no" then the device will use a fixed set of colored pens,
and will emulate other colors by shading. The default is "no" because monochrome PCL 5
devices, which are more common than colored ones, must use shading to emulate color.
pic2plot -T hpgl, which produces Hewlett–Packard Graphics Language output, is also
affected by several environment variables. The most important is HPGL_VERSION, which may
be set to "1", "1.5", or "2" (the default). "1" means that the output should be generic
HP-GL, "1.5" means that the output should be suitable for the HP7550A graphics plotter
and the HP758x, HP7595A and HP7596A drafting plotters (HP-GL with some HP-GL/2
extensions), and "2" means that the output should be modern HP-GL/2. If the version is
"1" or "1.5" then the only available fonts will be vector fonts, and all lines will be drawn with
a default thickness (the ‘-W’ option will not work). Additionally, if the version is "1" then
the filling of arbitrary curves with solid color will not be supported (circles and rectangles
aligned with the coordinate axes may be filled, though).
The position of the pic2plot -T hpgl graphics display on the page can be rotated
90 degrees counterclockwise by setting the HPGL_ROTATE environment variable to "yes".
This is not the same as the rotation obtained with the ‘--rotation’ option, since it both
rotates the graphics display and repositions its lower left corner toward another corner of
the page. Besides "no" and "yes", recognized values for the HPGL_ROTATE variable are
"0", "90", "180", and "270". "no" and "yes" are equivalent to "0" and "90", respectively.
"180" and "270" are supported only if HPGL_VERSION is "2" (the default).
Opaque filling and the drawing of visible white lines are supported only if HPGL_VERSION
is "2" (the default) and the environment variable HPGL_OPAQUE_MODE is "yes" (the default).
If the value is "no" then opaque filling will not be used, and white lines (if any), which
are normally drawn with pen #0, will not be drawn. This feature is to accommodate older
HP-GL/2 devices. HP-GL/2 pen plotters, for example, do not support opacity or the use
of pen #0 to draw visible white lines. Some older HP-GL/2 devices reportedly malfunction
if asked to draw opaque objects.
By default, pic2plot -T hpgl will draw with a fixed set of pens. Which pens are present
may be specified by setting the HPGL_PENS environment variable. If HPGL_VERSION is "1",
the default value of HPGL_PENS is "1=black"; if HPGL_VERSION is "1.5" or "2", the default
value of HPGL_PENS is "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan".
The format should be self-explanatory. By setting HPGL_PENS, you may specify a color for
any pen in the range #1. . . #31. For information on what color names are recognized, see
Appendix B [Color Names], page 166. Pen #1 must always be present, though it need not
be black. Any pen in the range #2. . . #31 may be omitted.
If HPGL_VERSION is "2" then pic2plot -T hpgl will also be affected by the environment
variable HPGL_ASSIGN_COLORS. If the value of this variable is "yes", then plot -T hpgl
will not be restricted to the palette specified in HPGL_PENS: it will assign colors to “logical
pens” in the range #1. . . #31, as needed. The default value is "no" because other than color
LaserJet printers and DesignJet plotters, not many HP-GL/2 devices allow the assignment
of colors to logical pens. In particular, HP-GL/2 pen plotters do not.
pic2plot -T tek, which produces output for a Tektronix terminal or emulator, checks
the TERM environment variable. If the value of TERM is a string beginning with "xterm",
Chapter 4: The pic2plot Program 47
‘-T type’
‘--output-format type’
(String, default "meta".) Select an output format of type type, which may
be one of the strings "X", "png", "pnm", "gif", "svg", "ai", "ps", "cgm",
"fig", "pcl", "hpgl", "regis", "tek", and "meta". These refer respectively to
the X Window System, PNG format, portable anymap (PBM/PGM/PPM) for-
mat, pseudo-GIF format, the XML-based Scalable Vector Graphics format, the
format used by Adobe Illustrator, idraw-editable Postscript, the WebCGM for-
mat for Web-based vector graphics, the format used by the xfig drawing editor,
the Hewlett–Packard PCL 5 printer language, the Hewlett–Packard Graphics
Language (by default, HP-GL/2), the ReGIS (remote graphics instruction set)
format developed by DEC, Tektronix format, and device-independent GNU
graphics metafile format.
‘-p n’
‘--page-number n’
(Nonnegative integer.) Display only page number n, within the Tektronix file or
sequence of Tektronix files that is being translated. Tektronix files may consist
of one or more pages, numbered beginning with zero.
The default behavior, if the ‘-p’ option is not used, is to display all nonempty
pages in succession. For example, tek2plot -T X displays each page in its own
X window. If the ‘-T png’ option, the ‘-T pnm’ option, the ‘-T gif’ option, the
‘-T svg’ option, the ‘-T ai’ option, or the ‘-T fig’ option is used, the default
behavior is to display only the first page, since files in PNG, PNM, pseudo-GIF,
SVG, AI, or Fig format may contain only a single page of graphics.
Most Tektronix files consist of either one page (page #0) or two pages (an empty
page #0, and page #1). Tektronix files produced by the GNU plotting utilities
(e.g., by graph -T tek) are normally of the latter sort.
‘-F font_name’
‘--font-name font_name’
(String, default "Courier" except for tek2plot -T png, tek2plot -T pnm,
tek2plot -T gif, tek2plot -T hpgl, tek2plot -T regis, and raw tek2plot,
for all of which "HersheySerif" is the default.) Set the font used for text to
font name. Font names are case-insensitive. If a font outside the Courier
family is chosen, the ‘--position-chars’ option (see below) should probably
be used. For a list of all fonts, see Section A.1 [Text Fonts], page 144. If the
specified font is not available, the default font will be used.
If you intend to print a PCL 5 file prepared with tek2plot -T pcl on a LaserJet
III, you should specify a font other than Courier. That is because the LaserJet
III, which was Hewlett–Packard’s first PCL 5 printer, did not come with a
scalable Courier typeface. The only PCL 5 fonts it supported were the eight
fonts in the CGTimes and Univers families. See Section A.1 [Text Fonts],
page 144.
Chapter 5: The tek2plot Program 50
‘-W line_width’
‘--line-width line_width’
(Float, default −1.0.) Set the thickness of lines, as a fraction of the size (i.e.,
minimum dimension) of the graphics display, to line width. A negative value
means that the default value provided by the GNU libplot graphics library
should be used. This is usually 1/850 times the size of the display, although if
‘-T X’, ‘-T png’, ‘-T pnm’, or ‘-T gif’ is specified, it is zero. By convention, a
zero-thickness line is the thinnest line that can be drawn. This is the case in
all output formats. Note, however, that the drawing editors idraw and xfig
treat zero-thickness lines as invisible.
tek2plot -T regis does not support drawing lines with other than a default
thickness, and tek2plot -T hpgl does not support doing so if the environment
variable HPGL_VERSION is set to a value less than "2" (the default).
‘--bg-color name’
(String, default "white".) Set the color used for the background to be name.
This is relevant only to tek2plot -T X, tek2plot -T png, tek2plot -T pnm,
tek2plot -T gif, tek2plot -T cgm, tek2plot -T regis, and tek2plot -T
meta. An unrecognized name sets the color to the default. For information
on what names are recognized, see Appendix B [Color Names], page 166.
The environment variable BG_COLOR can equally well be used to specify the
background color.
If the ‘-T png’ or ‘-T gif’ option is used, a transparent PNG file or a transparent
pseudo-GIF, respectively, may be produced by setting the TRANSPARENT_COLOR
environment variable to the name of the background color. See Section 5.3
[tek2plot Environment], page 53. If the ‘-T svg’ or ‘-T cgm’ option is used, an
output file without a background may be produced by setting the background
color to "none".
‘--bitmap-size bitmap_size’
(String, default "570x570".) Set the size of the graphics display in which the
plot will be drawn, in terms of pixels, to be bitmap size. This is relevant only
to tek2plot -T X, tek2plot -T png, tek2plot -T pnm, and tek2plot -T gif,
for all of which the size can be expressed in terms of pixels. The environment
variable BITMAPSIZE may equally well be used to specify the size.
The graphics display used by tek2plot -T X is a popped-up X window.
Command-line positioning of this window on an X Window System display is
supported. For example, if bitmap size is "570x570+0+0" then the window
will be popped up in the upper left corner.
If you choose a rectangular (non-square) window size, the fonts in the plot will
be scaled anisotropically, i.e., by different factors in the horizontal and vertical
direction. Any font that cannot be anisotropically scaled will be replaced by a
default scalable font, such as the Hershey vector font "HersheySerif".
For backward compatibility, tek2plot -T X allows the user to set the win-
dow size and position by setting the X resource Xplot.geometry, instead of
‘--bitmap-size’ or BITMAPSIZE.
Chapter 5: The tek2plot Program 51
‘--emulate-color option’
(String, default "no".) If option is "yes", replace each color in the output by an
appropriate shade of gray. This is seldom useful, except when using ‘tek2plot
-T pcl’ to prepare output for a PCL 5 device. (Many monochrome PCL 5
devices, such as monochrome LaserJets, do a poor job of emulating color on
their own. They usually map HP-GL/2’s seven standard pen colors, including
even yellow, to black.) You may equally well request color emulation by setting
the environment variable EMULATE_COLOR to "yes".
‘--max-line-length max_line_length’
(Integer, default 500.) Set the maximum number of points that a polygonal line
may contain, before it is flushed to the output device, to equal max line length.
If this flushing occurs, the polygonal line will be split into two or more sub-lines,
though the splitting should not be noticeable.
The reason for splitting long polygonal lines is that some display devices (e.g.,
old Postscript printers and HP-GL pen plotters) have limited buffer sizes. The
environment variable MAX_LINE_LENGTH can also be used to specify the max-
imum line length. This option has no effect on raw tek2plot, since it draws
polylines in real time and has no buffer limitations.
‘--page-size pagesize’
(String, default "letter".) Set the size of the page on which the plot will be po-
sitioned. This is relevant only to tek2plot -T svg, tek2plot -T ai, tek2plot
-T ps, tek2plot -T cgm, tek2plot -T fig, tek2plot -T pcl, and tek2plot
-T hpgl. "letter" means an 8.5 in by 11 in page. Any ISO page size in the
range "a0". . . "a4" or ANSI page size in the range "a". . . "e" may be specified
("letter" is an alias for "a" and "tabloid" is an alias for "b"). "legal", "ledger",
and "b5" are recognized page sizes also. The environment variable PAGESIZE
can equally well be used to specify the page size.
For tek2plot -T ai, tek2plot -T ps, tek2plot -T pcl, and tek2plot -T fig,
the graphics display (or ‘viewport’) within which the plot is drawn will be,
by default, a square region centered on the specified page. For tek2plot -T
hpgl, it will be a square region of the same size, but may be positioned differ-
ently. Either or both of the dimensions of the graphics display can be speci-
fied explicitly. For example, pagesize could be specified as "letter,xsize=4in",
or "a4,xsize=10cm,ysize=15cm". The dimensions are allowed to be negative
(a negative dimension results in a reflection).
The position of the graphics display, relative to its default position, may option-
ally be adjusted by specifying an offset vector. For example, pagesize could be
specified as "letter,yoffset=1.2in", or "a4,xoffset=−5mm,yoffset=2.0cm". It is
also possible to position the graphics display precisely, by specifying the loca-
tion of its lower left corner relative to the lower left corner of the page. For
example, pagesize could be specified as "letter,xorigin=2in,yorigin=3in", or
"a4,xorigin=0.5cm,yorigin=0.5cm". The preceding options may be intermin-
gled.
tek2plot -T svg and tek2plot -T cgm ignore the "xoffset", "yoffset", "xori-
gin", and "yorigin" options, since SVG format and WebCGM format have no
Chapter 5: The tek2plot Program 52
notion of the Web page on which the graphics display will ultimately be posi-
tioned. However, they do respect the "xsize" and "ysize" options. For more on
page sizes, see Appendix C [Page and Viewport Sizes], page 167.
‘--pen-color name’
(String, default "black".) Set the pen color to be name. An unrecognized name
sets the pen color to the default. For information on what color names are
recognized, see Appendix B [Color Names], page 166.
‘--position-chars’
Position the characters in each text string individually on the display. If the
text font is not a member of the Courier family, and especially if it is not a
fixed-width font, this option is recommended. It will improve the appearance
of text strings, at the price of making it difficult to edit the output file with
xfig or idraw.
‘--rotation angle’
(Float, default 0.0.) Set the rotation angle of the graphics display to be angle
degrees. The rotation is counterclockwise. The environment variable ROTATION
can equally well be used to specify the rotation angle.
This option is used for switching between portrait and landscape orientations,
which have rotation angles 0 and 90 degrees respectively. Postmodernists may
also find it useful.
‘--use-tek-fonts’
Use the fonts that were used on the original Tektronix 4010/4014 terminal,
to produce the most faithful rendition possible. This option is relevant
only to tek2plot -T X. Bitmap versions of the the four original Tektronix
fonts are distributed with the plotting utilities package, under the names
tekfont0. . . tekfont3. They may easily be installed on any modern
X Window System display. For this option to work properly, you must also
select a window size of 1024x1024 pixels, either by using the ‘--bitmap-size
1024x1024’ option or by setting the value of the Xplot.geometry resource.
The reason for this restriction is to prevent rescaling of the bitmap fonts.
This option is useful only if you have a file in Tektronix format that draws text
using native Tektronix fonts. Tektronix files produced by the GNU plotting
utilities (e.g., by graph -T tek) do not use native Tektronix fonts to draw text.
The following option is relevant only to raw tek2plot, i.e., relevant only if no output
format is specified with the ‘-T’ option. In this case tek2plot outputs a graphics metafile,
which may be translated to other formats by invoking plot.
‘-O’
‘--portable-output’
Output the portable (human-readable) version of GNU metafile format, rather
than a binary version (the default). This can also be requested by setting the
environment variable META_PORTABLE to "yes".
The following options request information.
‘--help’ Print a list of command-line options, and then exit.
Chapter 5: The tek2plot Program 53
‘--help-fonts’
Print a table of available fonts, and then exit. The table will depend on which
output format is specified with the ‘-T’ option. tek2plot -T X, tek2plot
-T svg, tek2plot -T ai, tek2plot -T ps, tek2plot -T cgm, and tek2plot
-T fig each support the 35 standard Postscript fonts. tek2plot -T svg,
tek2plot -T ai, tek2plot -T pcl, and tek2plot -T hpgl support the 45
standard PCL 5 fonts, and tek2plot -T pcl and tek2plot -T hpgl support
a number of Hewlett–Packard vector fonts. All of the preceding, together
with tek2plot -T png, tek2plot -T pnm, tek2plot -T gif, tek2plot -T
regis, and tek2plot -T tek, support a set of 22 Hershey vector fonts. Raw
tek2plot in principle supports any of these fonts, since its output must be
translated to other formats with plot. The plotfont utility will produce a
character map of any available font. See Chapter 6 [plotfont], page 56.
‘--list-fonts’
Like ‘--help-fonts’, but lists the fonts in a single column to facilitate piping
to other programs. If no output format is specified with the ‘-T’ option, the
full set of supported fonts is listed.
‘--version’
Print the version number of tek2plot and the plotting utilities package, and
exit.
CGM file is generated. Many older CGM interpreters and viewers, such as the ones built
into Microsoft Office and other commercial software, only support version 1 CGM files. The
CGM_MAX_VERSION environment variable may be set to "1", "2", "3", or "4" (the default) to
specify a maximum value for the version number. The CGM_ENCODING variable may also be
set, to specify the type of encoding used in the CGM file. Supported values are "clear text"
(i.e., human readable) and "binary" (the default). The WebCGM profile requires that the
binary encoding be used.
tek2plot -T pcl, which produces PCL 5 output for Hewlett–Packard printers, is af-
fected by the environment variable PCL_ASSIGN_COLORS. It should be set to "yes" when
producing PCL 5 output for a color printer or other color device. This will ensure accurate
color reproduction by giving the output device complete freedom in assigning colors, inter-
nally, to its “logical pens”. If it is "no" then the device will use a fixed set of colored pens,
and will emulate other colors by shading. The default is "no" because monochrome PCL 5
devices, which are more common than colored ones, must use shading to emulate color.
tek2plot -T hpgl, which produces Hewlett–Packard Graphics Language output, is also
affected by several environment variables. The most important is HPGL_VERSION, which may
be set to "1", "1.5", or "2" (the default). "1" means that the output should be generic
HP-GL, "1.5" means that the output should be suitable for the HP7550A graphics plotter
and the HP758x, HP7595A and HP7596A drafting plotters (HP-GL with some HP-GL/2
extensions), and "2" means that the output should be modern HP-GL/2. If the version is
"1" or "1.5" then the only available fonts will be vector fonts, and all lines will be drawn
with a default thickness (the ‘-W’ option will not work).
The position of the tek2plot -T hpgl graphics display on the page can be rotated
90 degrees counterclockwise by setting the HPGL_ROTATE environment variable to "yes".
This is not the same as the rotation obtained with the ‘--rotation’ option, since it both
rotates the graphics display and repositions its lower left corner toward another corner of
the page. Besides "no" and "yes", recognized values for the HPGL_ROTATE variable are
"0", "90", "180", and "270". "no" and "yes" are equivalent to "0" and "90", respectively.
"180" and "270" are supported only if HPGL_VERSION is "2" (the default).
The drawing of visible white lines is supported only if HPGL_VERSION is "2" and the
environment variable HPGL_OPAQUE_MODE is "yes" (the default). If the value is "no" then
white lines (if any), which are normally drawn with pen #0, will not be drawn. This
feature is to accommodate older HP-GL/2 devices. HP-GL/2 pen plotters, for example, do
not support the use of pen #0 to draw visible white lines. Some older HP-GL/2 devices
may, in fact, malfunction if asked to draw opaque objects.
By default, tek2plot -T hpgl will draw with a fixed set of pens. Which pens are present
may be specified by setting the HPGL_PENS environment variable. If HPGL_VERSION is "1",
the default value of HPGL_PENS is "1=black"; if HPGL_VERSION is "1.5" or "2", the default
value of HPGL_PENS is "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan".
The format should be self-explanatory. By setting HPGL_PENS, you may specify a color for
any pen in the range #1. . . #31. For information on what color names are recognized, see
Appendix B [Color Names], page 166. Pen #1 must always be present, though it need not
be black. Any pen in the range #2. . . #31 may be omitted.
If HPGL_VERSION is "2" then tek2plot -T hpgl will also be affected by the environment
variable HPGL_ASSIGN_COLORS. If the value of this variable is "yes", then tek2plot -T
Chapter 5: The tek2plot Program 55
hpgl will not be restricted to the palette specified in HPGL_PENS: it will assign colors to
“logical pens” in the range #1. . . #31, as needed. The default value is "no" because other
than color LaserJet printers and DesignJet plotters, not many HP-GL/2 devices allow the
assignment of colors to logical pens. In particular, HP-GL/2 pen plotters do not.
Chapter 6: The plotfont Utility 56
of their XLFD names. For example, the font "CharterBT-Roman" is available on many
X displays. Its XLFD name is "-bitstream-charter-medium-r-normal–0-0-0-0-p-0-iso8859-
1", and its shortened XLFD name is "charter-medium-r-normal". If you do
plotfont -T X charter-medium-r-normal
then a character map for this font will be displayed in a popped-up X window.
When using the ‘-T X’ option, you may also use the ‘--bitmap-size’ option to choose the
size of the popped-up window. Modern X displays can scale fonts by different amounts in
the horizontal and vertical directions. If, for example, you add ‘--bitmap-size 600x300’ to
the above command line, both the character map and the CharterBT-Roman font within it
will be scaled in this way.
‘--box’ Surround each character with a box, showing its extent to left and right. The
default is not to do this.
‘-j row’
‘--jis-row row’
Generate a character map for row row of a Japanese font arranged according
to JIS [Japanese Industrial Standard] X0208. The only such font currently
available is the HersheyEUC [Extended Unix Code] font. If used, this option
overrides the ‘-1’ and ‘-2’ options.
The valid rows are 1. . . 94. In the JIS X0208 standard, Roman characters are
located in row 3, and Japanese syllabic characters (Hiragana and Katakana)
are located in rows 4 and 5. Greek and Cyrillic characters are located in rows
6 and 7. Japanese ideographic characters (Kanji) are located in rows 16. . . 84.
Rows 16. . . 47 contain the JIS Level 1 Kanji, which are the most frequently
used. They are arranged according to On (old Chinese) reading. Rows 48. . . 84
contain the less frequently used JIS Level 2 Kanji.
The HersheyEUC font contains 596 of the 2965 Level 1 Kanji, and seven of
the Level 2 Kanji. It uses the 8-bit EUC-JP encoding. This encoding is a
multibyte encoding that includes the ASCII character set as well as the JIS
X0208 characters. It represents each ASCII character in the usual way, i.e., as
a single byte that does not have its high bit set. Each JIS X0208 character is
represented as two bytes, each with the high bit set. The first byte contains the
row number (plus 32), and the second byte contains the character number.
‘-T type’
‘--output-format type’
(String, default "meta".) Select an output format of type type, which may
be one of the strings "X", "png", "pnm", "gif", "svg", "ai", "ps", "cgm",
"fig", "pcl", "hpgl", "regis", "tek", and "meta". These refer respectively to
the X Window System, PNG format, portable anymap (PBM/PGM/PPM) for-
mat, pseudo-GIF format, the XML-based Scalable Vector Graphics format, the
format used by Adobe Illustrator, idraw-editable Postscript, the WebCGM for-
mat for Web-based vector graphics, the format used by the xfig drawing editor,
the Hewlett–Packard PCL 5 printer language, the Hewlett–Packard Graphics
Language (by default, HP-GL/2), the ReGIS (remote graphics instruction set)
format developed by DEC, Tektronix format, and device-independent GNU
graphics metafile format. The option ‘--display-type’ is an obsolete alterna-
tive to ‘--output-format’.
Files in PNG, PNM, pseudo-GIF, SVG, AI, or Fig format may contain only a
single page of graphics. So if the ‘-T png’ option, the ‘-T pnm’ option, the ‘-T
gif’ option, the ‘-T svg’ option, the ‘-T ai’ option, or the ‘-T fig’ option is
used, a character map will be produced for only the first-specified font.
‘--bg-color name’
(String, default "white".) Set the color used for the background to be name.
This is relevant only to plotfont -T X, plotfont -T png, plotfont -T pnm,
plotfont -T gif, plotfont -T cgm, plotfont -T regis, and plotfont -T
meta. An unrecognized name sets the color to the default. For information
Chapter 6: The plotfont Utility 59
on what names are recognized, see Appendix B [Color Names], page 166.
The environment variable BG_COLOR can equally well be used to specify the
background color.
If the ‘-T png’ or ‘-T gif’ option is used, a transparent PNG file or a transparent
pseudo-GIF, respectively, may be produced by setting the TRANSPARENT_COLOR
environment variable to the name of the background color. See Section 6.3
[plotfont Environment], page 61. If the ‘-T svg’ or ‘-T cgm’ option is used, an
output file without a background may be produced by setting the background
color to "none".
‘--bitmap-size bitmap_size’
(String, default "570x570".) Set the size of the graphics display in which the
character map will be drawn, in terms of pixels, to be bitmap size. This
is relevant only to plotfont -T X, plotfont -T png, plotfont -T pnm, and
plotfont -T gif, for all of which the size can be expressed in terms of pixels.
The environment variable BITMAPSIZE may equally well be used to specify the
size.
The graphics display used by plotfont -T X is a popped-up X window.
Command-line positioning of this window on an X Window System display is
supported. For example, if bitmap size is "570x570+0+0" then the window
will be popped up in the upper left corner.
If you choose a rectangular (non-square) window size, the fonts in the plot will
be scaled anisotropically, i.e., by different factors in the horizontal and vertical
direction.
For backward compatibility, plotfont -T X allows the user to set the win-
dow size and position by setting the X resource Xplot.geometry, instead of
‘--bitmap-size’ or BITMAPSIZE.
‘--emulate-color option’
(String, default "no".) If option is "yes", replace each color in the output by an
appropriate shade of gray. This is seldom useful, except when using ‘plotfont
-T pcl’ to prepare output for a PCL 5 device. (Many monochrome PCL 5
devices, such as monochrome LaserJets, do a poor job of emulating color on
their own. They usually map HP-GL/2’s seven standard pen colors, including
even yellow, to black.) You may equally well request color emulation by setting
the environment variable EMULATE_COLOR to "yes".
‘--numbering-font-name font_name’
(String, default "Helvetica" except for plotfont -T pcl, for which "Univers"
is the default, and plotfont -T png, plotfont -T pnm, plotfont -T gif,
plotfont -T hpgl, plotfont -T regis, and plotfont -T tek, for all of which
"HersheySerif" is the default.) Set the font used for the numbering of the
characters in the character map(s) to be font name.
‘--page-size pagesize’
(String, default "letter".) Set the size of the page on which the character
map(s) will be drawn. This is relevant only to plotfont -T svg, plotfont
-T ai, plotfont -T ps, plotfont -T fig, plotfont -T pcl, and plotfont -T
Chapter 6: The plotfont Utility 60
hpgl. "letter" means an 8.5 in by 11 in page. Any ISO page size in the range
"a0". . . "a4" or ANSI page size in the range "a". . . "e" may be specified ("let-
ter" is an alias for "a" and "tabloid" is an alias for "b"). "legal", "ledger",
and "b5" are recognized page sizes also. The environment variable PAGESIZE
can equally well be used to specify the page size.
For plotfont -T ai, plotfont -T ps, plotfont -T pcl, and plotfont -T fig,
the graphics display (or ‘viewport’) within which the character map is drawn
will be, by default, a square region centered on the specified page. For plotfont
-T hpgl, it will be a square region of the same size, but may be positioned dif-
ferently. Either or both of the dimensions of the graphics display can be spec-
ified explicitly. For example, pagesize could be specified as "letter,xsize=4in",
or "a4,xsize=10cm,ysize=15cm". The dimensions are allowed to be negative
(a negative dimension results in a reflection).
The position of the graphics display, relative to its default position, may option-
ally be adjusted by specifying an offset vector. For example, pagesize could be
specified as "letter,yoffset=1.2in", or "a4,xoffset=−5mm,yoffset=2.0cm". It is
also possible to position the graphics display precisely, by specifying the loca-
tion of its lower left corner relative to the lower left corner of the page. For
example, pagesize could be specified as "letter,xorigin=2in,yorigin=3in", or
"a4,xorigin=0.5cm,yorigin=0.5cm". The preceding options may be intermin-
gled.
plotfont -T svg and plotfont -T cgm ignore the "xoffset", "yoffset", "xori-
gin", and "yorigin" options, since SVG format and WebCGM format have no
notion of the Web page on which the graphics display will ultimately be posi-
tioned. However, they do respect the "xsize" and "ysize" options. For more on
page sizes, see Appendix C [Page and Viewport Sizes], page 167.
‘--pen-color name’
(String, default "black".) Set the pen color to be name. An unrecognized name
sets the pen color to the default. For information on what color names are
recognized, see Appendix B [Color Names], page 166.
‘--rotation angle’
(Float, default 0.0.) Set the rotation angle of the graphics display to be angle
degrees. The rotation is counterclockwise. The environment variable ROTATION
can equally well be used to specify the rotation angle.
This option is used for switching between portrait and landscape orientations,
which have rotation angles 0 and 90 degrees respectively. Postmodernists may
also find it useful.
‘--title-font-name font_name’
(String) Set the font used for the title of each character map to be font name.
Normally the font used for the title is the same as the font whose character set
is being displayed. This option is useful when producing character maps for
unusual fonts such as "ZapfDingbats" and "Wingdings".
The following option is relevant only to raw plotfont, i.e., relevant only if no output
format is specified with the ‘-T’ option. In this case plotfont outputs a graphics metafile,
which may be translated to other formats by invoking plot.
Chapter 6: The plotfont Utility 61
‘-O’
‘--portable-output’
Output the portable (human-readable) version of GNU metafile format, rather
than a binary version (the default). This can also be requested by setting the
environment variable META_PORTABLE to "yes".
The following options request information.
‘--help’ Print a list of command-line options, and then exit.
‘--help-fonts’
Print a table of available fonts, and then exit. The table will depend on which
output format is specified with the ‘-T’ option. plotfont -T X, plotfont
-T svg, plotfont -T ai, plotfont -T ps, plotfont -T cgm, and plotfont
-T fig each support the 35 standard Postscript fonts. plotfont -T svg,
plotfont -T ai, plotfont -T pcl, and plotfont -T hpgl support the 45
standard PCL 5 fonts, and plotfont -T pcl and plotfont -T hpgl support
a number of Hewlett–Packard vector fonts. All of the preceding, together
with plotfont -T png, plotfont -T pnm, plotfont -T gif, plotfont -T
regis, and plotfont -T tek, support a set of 22 Hershey vector fonts. Raw
plotfont in principle supports any of these fonts, since its output must be
translated to other formats with plot.
‘--list-fonts’
Like ‘--help-fonts’, but lists the fonts in a single column to facilitate piping
to other programs. If no output format is specified with the ‘-T’ option, the
full set of supported fonts is listed.
‘--version’
Print the version number of plotfont and the plotting utilities package, and
exit.
“logical pens” in the range #1. . . #31, as needed. The default value is "no" because other
than color LaserJet printers and DesignJet plotters, not many HP-GL/2 devices allow the
assignment of colors to logical pens. In particular, HP-GL/2 pen plotters do not.
plotfont -T tek, which produces output for a Tektronix terminal or emulator, checks
the TERM environment variable. If the value of TERM is a string beginning with "xterm",
"nxterm", or "kterm", it is taken as a sign that plotfont is running in an X Window
System VT100 terminal emulator: an xterm, nxterm, or kterm. Before drawing graphics,
plotfont -T tek will emit an escape sequence that causes the terminal emulator’s auxiliary
Tektronix window, which is normally hidden, to pop up. After the graphics are drawn, an
escape sequence that returns control to the original VT100 window will be emitted. The
Tektronix window will remain on the screen.
If the value of TERM is a string beginning with "kermit", "ansi.sys", or "nansi.sys", it is
taken as a sign that plotfont is running in the VT100 terminal emulator provided by
the MS-DOS version of kermit. Before drawing graphics, plotfont -T tek will emit an
escape sequence that switches the terminal emulator to Tektronix mode. Also, some of the
Tektronix control codes emitted by plotfont -T tek will be kermit-specific. There will be
a limited amount of color support, which is not normally the case (the 16 ansi.sys colors
will be supported). After drawing graphics, plotfont -T tek will emit an escape sequence
that returns the emulator to VT100 mode. The key sequence ‘ALT minus’ can be employed
manually within kermit to switch between the two modes.
Chapter 7: The spline Program 64
In general, the interpolating function will be a piecewise cubic spline. That is, between
each pair of adjacent ‘knots’ (points in the input dataset), y will be a cubic function of t.
This function will differ, depending on which pair of knots y lies between. At each knot,
both the slope and curvature of the cubic pieces to either side will match. In mathematical
terms, the interpolating curve will be twice continuously differentiable.
spline supports ‘adding tension’ to the interpolating curve. A nonzero value for the
tension can be specified with the ‘-T’ option. For example, a spline under considerable
tension can be computed and displayed by doing
echo 0 0 1 0 2 0 | spline -T 10 | graph -T X
As the tension parameter is increased to positive infinity, the spline will converge to a
polygonal line. You are meant to think of the spline as being drawn taut. Actually, tension
may be negative as well as positive. A spline with negative tension will tend to bow outward,
in fact to oscillate sinusoidally. But as the tension decreases to negative infinity, the spline,
though oscillatory, will again converge to a polygonal line.
If the tension is positive, its reciprocal will be the maximum range of the independent
variable t over which the spline will ‘like to curve’. Increasing the tension far above zero will
accordingly force the spline to consist of short curved sections, centered on the data points,
and sections that are almost straight. It follows that tension is a ‘dimensionful’ quantity.
If the tension is nonzero, then when the values of the independent variable are multiplied
by some common positive factor, the tension should be divided by the same factor to obtain
a scaled version of the original spline. If the tension is zero (the default, or cubic spline
case), then the computation of the spline will be unaffected by linear scaling of the data.
In mathematical terms, a spline under tension will satisfy the differential equation
y 0000 = sgn(tension)tension2 y 00
between each successive pair of knots. If the tension equals zero, which is the default, the
fourth derivative of y with respect to t will equal zero at every point. In this case, y as a
function of t will reduce to a cubic polynomial between each successive pair of knots. But
if the tension is nonzero, y will not be a polynomial function of t. It may be expressed
in terms of exponential functions, however.
Irrespective of whether or not the spline is under tension, you may specify the ‘-p’ option
if you wish the spline to be a periodic function of t. This will only work if the y values
for the first and last points in the dataset are equal. Otherwise, it would make no sense to
compute a periodic interpolation.
It is sometimes useful to interpolate between data points at the same time as they are
generated by an auxiliary program. That is, it is useful for spline to function as a real-time
filter. spline does not normally act as a filter, since computing an interpolating curve that
is as smooth as possible is a global task. But if the ‘-f’ option is specified, spline will
indeed function as a filter. A different interpolation algorithm (cubic Bessel interpolation,
which is local rather than global) will be used. If ‘-f’ is specified, ‘-p’ may not be specified.
Also, if ‘-f’ is specified then an interpolation interval (a range of t values) must be requested
explicitly with the ‘-t’ option.
Cubic Bessel interpolation is inherently less smooth than the construction of a global
cubic spline. If the ‘-f’ option is specified, the slope of the spline at each knot will be
Chapter 7: The spline Program 66
chosen by fitting a parabola through that knot, and the two adjacent knots. The slopes of
the two interpolating segments to either side of each interior knot will match at that knot,
but typically their curvatures will not. In mathematical terms, the interpolating curve will
be continuously differentiable, but in general not twice continuously differentiable. This
loss of differentiability is the price that is paid for functioning as a real-time filter.
‘-f’
‘--filter’
Use a local interpolation algorithm (the cubic Bessel algorithm), so that spline
can be used as a real-time filter. The slope of the interpolating curve at each
point in a dataset will be chosen by fitting a quadratic function through that
point and the two adjacent points in the dataset. If ‘-f’ is specified then the
‘-t’ option, otherwise optional, must be used as well. Also, if ‘-f’ is specified
then the ‘-k’, ‘-p’, and ‘-T’ options may not be used.
If ‘-f’ is not specified, then a different (global) interpolation algorithm will be
used.
‘-k k’
‘--boundary-condition k’
(Float, default 1.0.) Set the boundary condition parameter for each constructed
spline to be k. In each of its components, the spline will satisfy the two bound-
ary conditions y 00 [0] = ky 00 [1] and y 00 [n] = ky 00 [n − 1]. Here y[0] and y[1] signify
the values of a specified component of the vector-valued dependent variable y
at the first two points of a dataset, and y[n − 1] and y[n] the values at the last
two points. Setting k to zero will yield a ‘natural’ spline, i.e., one that has zero
curvature at the two ends of the dataset. The ‘-k’ option may not be used if
‘-f’ or ‘-p’ is specified.
‘-n n’
‘--number-of-intervals n’
(Positive integer, default 100.) Subdivide the interval over which interpolation
occurs into n subintervals. The number of data points computed, and written
to the output, will be n + 1.
‘-p’
‘--periodic’
Construct a periodic spline. If this option is specified, the y values for the first
and last points in each dataset must be equal. The ‘-f’ and ‘-k’ options may
not be used if ‘-p’ is specified.
‘-T tension’
‘--tension tension’
(Float, default 0.0.) Set the tension in each interpolating spline to be tension.
Between each pair of successive points in a dataset, the constructed spline
will satisfy the differential equation y 0000 = sgn(tension)tension2 y 00 in each of
its components. If tension equals zero, the spline will be piecewise cubic. As
tension increases to positive infinity, the spline will converge to a polygonal line.
The ‘-T’ option may not be used if ‘-f’ is specified.
‘-t tmin tmax [tspacing]’
‘--t-limits tmin tmax [tspacing]’
For each dataset, set the interval over which interpolation occurs to be the
interval between tmin and tmax. If tspacing is not specified, the interval will
be divided into the number of subintervals specified by the ‘-n’ option. If the
‘-t’ option is not used, the interval over which interpolation occurs will be
the entire range of the independent variable in the dataset. The ‘-t’ option
Chapter 7: The spline Program 69
must always be used if the ‘-f’ option is used to request filter-like behavior (see
above).
The following options specify the format of the input file(s) and the output file.
‘-d dimension’
‘--y-dimension dimension’
(Integer, default 1.) Set the dimensionality of the dependent variable y in the
input and output files to be dimension.
‘-I data-format’
‘--input-format data-format’
(Character, default ‘a’.) Set the data format for the input file(s) to be data-
format. The possible data formats are as follows.
‘a’ ASCII format. Each file is a sequence of floating point numbers,
interpreted as the t and y coordinates of the successive data points
in a dataset. If y is d-dimensional, there will be d + 1 numbers for
each point. The t and y coordinates of a point need not appear on
the same line, and points need not appear on different lines. But if
a blank line occurs (i.e., two newlines in succession are seen), it is
interpreted as the end of a dataset, and the beginning of the next.
‘f’ Single precision binary format. Each file is a sequence of floating
point numbers, interpreted as the t and y coordinates of the suc-
cessive data points in a dataset. If y is d-dimensional, there will be
d + 1 numbers for each point. Successive datasets are separated by
a single occurrence of the quantity FLT_MAX, which is the largest
possible single precision floating point number. On most machines
this is approximately 3.4 × 1038 .
‘d’ Double precision binary format. Each file is a sequence of dou-
ble precision floating point numbers, interpreted as the t and y
coordinates of the successive data points in a dataset. If y is d-
dimensional, there will be d + 1 numbers for each point. Successive
datasets are separated by a single occurrence of the quantity DBL_
MAX, which is the largest possible double precision floating point
number. On most machines this is approximately 1.8 × 10308 .
‘i’ Integer binary format. Each file is a sequence of integers, inter-
preted as the t and y coordinates of the successive data points in
a dataset. If y is d-dimensional, there will be d + 1 numbers for
each point. Successive datasets are separated by a single occur-
rence of the quantity INT_MAX, which is the largest possible integer.
On most machines this is 231 − 1.
‘-a [step_size [lower_limit]]’
‘--auto-abscissa [step_size [lower_limit]]’
(Floats, defaults 1.0 and 0.0.) Automatically generate values for the inde-
pendent variable (t). Irrespective of data format (‘a’, ‘f’, ‘d’, or ‘i’), this op-
tion specifies that the values of the independent variable (t) are missing from
Chapter 7: The spline Program 70
the input file: the dataset(s) to be read contain only values of the dependent
variable (y), so that if y is d-dimensional, there will be only d numbers for each
point. The increment from each t value to the next will be step size, and the
first t value will be lower limit.
‘-A’
‘--auto-dist-abscissa’
Automatically generate values for the independent variable (t). This is a variant
form of the ‘-a’ option. The increment from each t value to the next will be
the distance between the corresponding y values, and the first t value will be
0.0. This option is useful when interpolating curves rather than functions (see
Section 7.2 [Advanced Use of spline], page 66).
‘-O data-format’
‘--output-format data-format’
(Character, default ‘a’.) Set the data format for the output file to be data-
format. The interpretation of the data-format argument is the same as for the
‘-I’ option.
‘-P significant-digits’
‘--precision significant-digits’
(Positive integer, default 6.) Set the numerical precision for the t and y values
in the output file to be significant-digits. This takes effect only if the output
file is written in ‘a’ format, i.e., in ASCII.
‘-s’
‘--suppress-abscissa’
Omit the independent variable t from the output file; for each point, supply only
the dependent variable y. If y is d-dimensional, there will be only d numbers
for each point, not d + 1. This option is useful when interpolating curves rather
than functions (see Section 7.2 [Advanced Use of spline], page 66).
The following options request information.
‘--help’ Print a list of command-line options, and then exit.
‘--version’
Print the version number of spline and the plotting utilities package, and exit.
Chapter 8: The ode Program 71
After the above output, ode will wait for further instructions. Entering for example the
line
step 1, 0
should yield two more columns of numbers, containing the values of t and y that are com-
puted when t is stepped back from 1 to 0. You could type instead
step 1, 2
to increase rather than decrease t. To exit ode, you would type a line containing only ‘.’,
i.e. a single period, and tap ‘return’. ode will also exit if it sees an end-of-file indicator in
its input stream, which you may send from your terminal by typing control-D.
Each line of the preceding example should be self-explanatory. A ‘step’ statement sets
the beginning and the end of an interval over which the independent variable (here, t) will
range, and causes ode to set the numerical scheme in motion. The initial value appearing
in the first ‘step’ statement (i.e., 0) and the assignment statement
y = 1
are equivalent to the initial condition y(0) = 1. The statements ‘y’ = y’ and ‘y = 1’ are
very different: ‘y’ = y’ defines a way of computing the derivative of y, while ‘y = 1’ sets
the initial value of y. Whenever a ‘step’ statement is encountered, ode tries to step the
independent variable through the interval it specifies. Which values are to be printed at
each step is specified by the most recent ‘print’ statement. For example,
print t, y, y’
would cause the current value of the independent variable t, the variable y, and its derivative
to be printed at each step.
To illustrate ode’s ability to take its input or the initial part of its input from a file, you
could prepare a file containing the following lines:
# an ode to Euler
y = 1
y’ = y
print t, y, y’
Call this file ‘euler’. (The ‘#’ line is a comment line, which may appear at any point. Ev-
erything from the ‘#’ to the end of the line on which it appears will be ignored.) To process
this file with ode, you could type on your terminal
ode -f euler
step 0, 1
These two lines cause ode to read the file ‘euler’, and the stepping to take place. You will
now get three quantities (t, y, and y 0 ) printed at each of the values of t between 0 and 1.
At the conclusion of the stepping, ode will wait for any further commands to be input from
the terminal. This example illustrates that
ode -f euler
is not equivalent to
ode < euler
The latter would cause ode to take all its input from the file ‘euler’, while the former
allows subsequent input from the terminal. For the latter to produce output, you would
Chapter 8: The ode Program 74
need to include a ‘step’ line at the end of the file. You would not need to include a ‘.’ line,
however. ‘.’ is used to terminate input only when input is being read from a terminal.
A second simple example involves the numerical solution of a second-order differential
equation. Consider the initial value problem
y 00 (t) = −y(t)
y(0) = 0
y 0 (0) = 1
Its solution would be
y(t) = sin(t)
To solve this problem using ode, you must express this second-order equation as two first-
order equations. Toward this end you would introduce a new function, called yp say, of the
independent variable t. The pair of equations
y 0 = yp
yp0 = −y
would be equivalent to the single equation above. This sort of reduction of an n’th order
problem to n first order problems is a standard technique.
To plot the variable y as a function of the variable t, you could create a file containing
the lines
# sine : y’’(t) = -y(t), y(0) = 0, y’(0) = 1
sine’ = cosine
cosine’ = -sine
sine = 0
cosine = 1
print t, sine
(y and yp have been renamed sine and cosine, since that is what they will be.) Call this
file ‘sine’. To display the generated data points on an X Window System display as they
are generated, you would type
ode -f sine | graph -T X -x 0 10 -y -1 1
step 0, 2*PI
.
After you type the ode line, graph -T X will pop up a window, and after you type the ‘step’
line, the generated dataset will be drawn in it. The ‘-x 0 10’ and ‘-y -1 1’ options, which
set the bounds for the two axes, are necessary if you wish to display points in real time:
as they are generated. If the axis bounds were not specified on the command line, graph
-T X would wait until all points are read from the input before determining the bounds,
and drawing the plot.
A slight modification of this example, showing how ode can generate several datasets
in succession and plot them on the same graph, would be the following. Suppose that you
type on your terminal the following lines.
ode -f sine | graph -T X -C -x 0 10 -y -1 1
step 0, PI
step PI, 2*PI
step 2*PI, 3*PI
.
Chapter 8: The ode Program 75
Then the sine curve will be traced out in three stages. Since the output from each ‘step’
statement ends with a blank line, graph -T X will treat each section of the sine curve as a
different dataset. If you are using a color display, each of the three sections will be plotted in
a different color. This is a feature provided by graph, which normally changes its linemode
after each dataset it reads. If you do not like this feature, you may turn it off by using
graph -T X -B instead of graph -T X.
In the above examples, you could use any of the other variants of graph instead of graph
-T X. For example, you could use graph -T ps to obtain a plot in encapsulated Postscript
format, by typing
ode -f sine | graph -T ps > plot.ps
step 0, 2*PI
.
You should note that of the variants of graph, the variants graph -T png, graph -T pnm,
graph -T gif, graph -T svg, graph -T ai, graph -T ps, graph -T cgm, graph -T fig,
graph -T pcl and graph -T hpgl do not produce output in real time, even when the axis
bounds are specified with the ‘-x’ and ‘-y’ options. So if any of these variants is used, the
plot will be produced only when input from ode is terminated, which will occur when you
type ‘.’.
In the preceding examples, the derivatives of the dependent variables were specified by
comparatively simple expressions. They are allowed to be arbitrarily complicated functions
of the dependent variables and the independent variable. They may also involve any of the
functions that are built into ode. ode has a fair number of functions built in, including abs,
sqrt, exp, log, log10, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh,
and atanh. Less familiar functions which are built into it are besj0, besj1, besy0, besy1,
erf, erfc, inverf, lgamma, gamma, norm, invnorm, ibeta, and igamma. These have the
same definitions as in the plotting program gnuplot. (All functions take a single argument,
except for ibeta, which takes three, and igamma, which takes two). ode also knows the
meaning of the constant ‘PI’, as the above examples show. The names of the preceding
functions are reserved, so, e.g., ‘cos’ and ‘sin’ may not be used as names for variables.
Other than the restriction of avoiding reserved names and keywords, the names of vari-
ables may be chosen arbitrarily. Any sequence of alphanumeric characters starting with an
alphabetic character may be used; the first 32 characters are significant. It is worth noting
that ode identifies the independent variable by the fact that it is (or should be) the only
variable that has not appeared on the left side of a differential equation or an initial value
assignment. If there is more than than one such variable then no stepping takes place;
instead, an error message is printed. If there is no such variable, a dummy independent
variable is invented and given the name ‘(indep)’, internally.
r = 26
x = 0; y = 1; z = 0
print x, y
step 0, 200
Then executing the command
ode < lorenz | graph -T X -C -x -10 10 -y -10 10
would produce a plot of the Lorenz attractor (strictly speaking, a plot of one of its two-
dimensional projections). You may produce a Postscript plot of the Lorenz attractor, and
print it, by doing something like
ode < lorenz | graph -T ps -x -10 10 -y -10 10 -W 0 | lpr
The ‘-W 0’ (“zero width”) option requests that graph -T ps use the thinnest line possible,
to improve the visual appearance of the plot on a printer or other Postscript device.
Besides plotting a visually striking object in real time, the Lorenz attractor example
shows how statements may be separated by semicolons, rather than appearing on different
lines. It also shows how to use symbolic constants. In the description read by ode the
parameter r is a variable like x, y, and z. But unlike them it is not updated during stepping,
since no formula for its derivative r0 is given.
Our second example deals with the interactive construction of a ‘phase portrait’: a set of
solution curves with different initial conditions. Phase portraits are of paramount interest
in the qualitative theory of differential equations, and also possess æsthetic appeal.
Since a description read by ode may contain any number of ‘step’ statements, multiple
solution curves may be plotted in a single run. The most recent ‘print’ statement will
be used with each ‘step’ statement. In practice, a phase portrait would be drawn from
a few well-chosen solution curves. Choosing a good set of solution curves may require
experimentation, which makes interactivity and real-time plotting all-important.
As an example, consider a so-called Lotka–Volterra predator–prey model. Suppose that
in a lake there are two species of fish: A (the prey) who live by eating a plentiful supply
of plants, and B (the predator) who eat A. Let x(t) be the population of A and y(t) the
population of B at time t. A crude model for the interaction of A and B is given by the
equations
x0 = x(a − by)
y 0 = y(cx − d)
where a, b, c, d are positive constants. To draw a phase portrait for this system interactively,
you could type
ode | graph -T X -C -x 0 5 -y 0 5
x’ = (a - b*y) * x
y’ = (c*x - d) * y
a = 1; b = 1; c = 1; d = 1;
print x, y
Chapter 8: The ode Program 77
x = 1; y = 2
step 0, 10
x = 1; y = 3
step 0, 10
x = 1; y = 4
step 0, 10
x = 1; y = 5
step 0, 10
.
Four curves will be drawn in succession, one per ‘step’ line. They will be periodic; this
periodicity is similar to the fluctuations between predator and prey populations that occur
in real-world ecosystems. On a color display the curves will appear in different colors, since
by default, graph changes the linemode between datasets. That feature may be turned off
by using graph -T X -B rather than graph -T X.
It is sometimes useful to use ode and graph to plot discrete points, which are not joined
by line segments to form a curve. Our third example illustrates this. Suppose the file
‘atwoods’ contains the lines
m = 1
M = 1.0625
a = 0.5; adot = 0
l = 10; ldot = 0
print l, ldot
step 0, 400
The first few lines describe the functioning of a so-called swinging Atwood’s machine. An
ordinary Atwood’s machine consists of a taut cord draped over a pulley, with a mass attached
to the cord at each end. Normally, the heavier mass (M ) would win against the lighter
mass (m), and draw it upward. A swinging Atwood’s machine allows the lighter mass to
swing back and forth as well as move vertically.
The ‘print l, ldot’ statement requests that the vertical position and vertical velocity
of the lighter mass be printed out at each step. If you run the command
ode < atwoods | graph -T X -x 9 11 -y -1 1 -m 0 -S 1 -X l -Y ldot
you will obtain a real-time plot. The ‘-m 0’ option requests that successive data points
not be joined by line segments, and the ‘-S 1’ option requests that plotting symbol #1
(a dot) be plotted at the location of each point. As you will see if you run this command,
the heavy mass does not win against the lighter mass. Instead the machine oscillates non-
periodically. Since the motion is non-periodic, the plot benefits from being drawn as a
sequence of unconnected points.
We conclude by mentioning a few features of ode that may be useful when things are
not going quite right. One of them is the ‘examine’ statement. It may be used to discover
Chapter 8: The ode Program 78
pertinent information about any variable in a system. For details, see Section 8.8 [Input
Language], page 85.
Another useful feature is that the ‘print’ statement may be used to print out more
than just the value of a variable. As we have seen, if the name of the variable is followed
by ‘’’, the derivative of the variable will be printed instead. In a similar way, following
the variable name with ‘?’, ‘!’, or ‘~’ prints respectively the relative single-step error, the
absolute single-step error, or the accumulated error (not currently implemented). These
quantities are discussed in Section 8.6 [Numerical Error], page 81.
The ‘print’ statement may be more complicated than was shown in the preceding ex-
amples. Its general structure is
print <pr-list> [every <const>] [from <const>]
The bracket notation ‘[...]’ means that the enclosed statements are optional. Until now
we have not mentioned the ‘every’ clause or the ‘from’ clause. The <pr-list> is familiar,
however; it is simply a comma-separated list of variables. For example, in the statement
print t, y, y’ every 5 from 1
the <pr-list> is <t, y, y’>. The clauses ‘every 5’ and ‘from 1’ specify that printing
should take place after every fifth step, and that the printing should begin when the inde-
pendent variable t reaches 1. An ‘every’ clause is useful if you wish to ‘thin out’ the output
generated by a ‘step’ statement, and a ‘from’ clause is useful if you wish to view only the
final portion of a solution curve.
The following options specify the numerical integration scheme. Only one of the three basic
option ‘-R’, ‘-A’, and ‘-E’ may be specified. The default is ‘-R’ (Runge–Kutta–Fehlberg).
‘-R [stepsize]’
‘--runge-kutta [stepsize]’
Use a fifth-order Runge–Kutta–Fehlberg algorithm, with an adaptive stepsize
unless a constant stepsize is specified. When a constant stepsize is specified
and no error analysis is requested, then a classical fourth-order Runge–Kutta
scheme is used.
‘-A [stepsize]’
‘--adams-moulton [stepsize]’
Use a fourth-order Adams–Moulton predictor–corrector scheme, with an adap-
tive stepsize unless a constant stepsize, stepsize, is specified. The Runge–Kutta–
Fehlberg algorithm is used to get past ‘bad’ points (if any).
‘-E [stepsize]’
‘--euler [stepsize]’
Use a ‘quick and dirty’ Euler scheme, with a constant stepsize. The default
value of stepsize is 0.1. Not recommended for serious applications.
The error bound options ‘-r’ and ‘-e’ (see below) may not be used if ‘-E’ is
specified.
The following options set the error bounds on the numerical solution scheme.
‘-s’
‘--suppress-error-bound’
Suppress the ceiling on single-step error, allowing ode to continue even if this
ceiling is exceeded. This may result in large numerical errors.
Finally, the following options request information.
‘--help’ Print a list of command-line options, and then exit.
‘--version’
Print the version number of ode and the plotting utilities package, and exit.
would induce an arithmetic exception. That is because on most machines, the double
precision quantities that ode uses internally are limited to a maximum size of approximately
1.8 × 10308 .
When ode is in the ‘solving’ state, i.e., computing a numerical solution, similar arithmetic
exceptions may occur. If so, the solution will be interrupted and a message resembling
ode: arithmetic exception while calculating y’
will be printed. However, ode will not exit; the exception will be ‘caught’. ode itself
recognizes the following exceptional conditions: square root of a negative number, logarithm
of a non-positive number, and negative number raised to a non-integer power. ode will catch
any of these operations before it is performed, and print an error message specifying which
illegal operation it has encountered.
ode: square root of a negative number while calculating y’
would be a typical error message.
If the machine on which ode is running supports the ‘matherr’ facility for reporting
errors in the computation of standard mathematical functions, it will be used. This facility
reports domain errors and range errors (overflows, underflows, and losses of significance)
that could occur when evaluating such functions as ‘log’, ‘gamma’, etc.; again, before they
are performed. If the matherr facility is present, the error message will be fairly informative.
For example, the error message
ode: range error (overflow) in lgamma while calculating y’
could be generated if the logarithmic gamma function ‘lgamma’ is evaluated at a value of its
argument that is too large. The generation of any such message, except a message warning
of an underflow, will cause the numerical solution to be interrupted.
There is another sort of error that may occur during numerical solution: the condition
that an error ceiling, which the user may set with the ‘-r’ option or the ‘-e’ option, is
exceeded. This too will cause the numerical solution to be abandoned, and ode to switch
back to reading input.
a stepsize, ode will do so on the basis of the relative single-step error. By default, it will
choose the stepsize so as to maintain an accuracy of eight significant digits in each step.
That is, it will choose the stepsize so as not to violate an upper bound of 10−9 on the
relative single-step error. This ceiling may be adjusted with the ‘-r’ option.
Where does numerical error come from? There are two sources. The first is the finite pre-
cision of machine computation. All computers work with floating point numbers, which are
not real numbers, but only an approximation to real numbers. However, all computations
performed by ode are done to double precision, so floating point error tends to be relatively
small. You may nonetheless detect the difference between real numbers and floating point
numbers by experimenting with the ‘-p 17’ option, which will print seventeen significant
digits. On most machines, that is the precision of a double precision floating point number.
The second source of numerical error is often called the theoretical truncation error. It is
the difference between the actual solution and the approximate solution due solely to the
numerical scheme. At the root of many numerical schemes is an infinite series; for ordinary
differential equations, it is a Taylor expansion. Since the computer cannot compute all the
terms in an infinite series, a numerical scheme necessarily uses a truncated series; hence the
term. The single-step error is the sum of the theoretical truncation error and the floating
point error, though in practice the floating point error is seldom included. The single-step
error estimated by ode consists only of the theoretical truncation error.
We say that a numerical scheme is stable, when applied to a particular initial value
problem, if the error accumulated during the solution of the problem over a fixed interval
decreases as the stepsize decreases; at least, over a wide range of step sizes. With this
definition both the Runge–Kutta–Fehlberg (‘-R’) scheme and the Adams–Moulton (‘-A’)
scheme are stable (a statement based more on experience than on theoretical results) for a
wide class of problems.
After these introductory remarks, we list some common sources of accumulated error
and instability in any numerical scheme. Usually, problems with large accumulated error
and instability are due to the single-step error in the vicinity of a ‘bad’ point being large.
1. Singularities.
ode should not be used to generate a numerical solution on any interval containing a
singularity. That is, ode should not be asked to step over points at which the system
of differential equations is singular or undefined.
You will find the definitions of singular point, regular singular point, and irregular
singular point in any good differential equations text. If you have no favorite, try
Birkhoff and Rota’s Ordinary Differential Equations, Chapter 9. Always locate and
classify the singularities of a system, if any, before applying ode.
2. Ill-posed problems.
For ode to yield an accurate numerical solution on an interval, the true solution must
be defined and well-behaved on that interval. The solution must also be real. Whenever
any of these conditions is violated, the problem is said to be ill-posed. Ill-posedness
may occur even if the system of differential equations is well-behaved on the interval.
Strange results, e.g., the stepsize suddenly shrinking to the machine limit or the solution
suddenly blowing up, may indicate ill-posedness.
As an example of ill-posedness (in fact, an undefined solution) consider the innocent-
looking problem:
Chapter 8: The ode Program 83
y0 = y2
y(1) = −1
The solution on the domain t > 0 is
y(t) = −1/t.
With this problem you must not compute a numerical solution on any interval that
includes t = 0. To convince yourself of this, try to use the ‘step’ statement
step 1, -1
on this system. How does ode react?
As another example of ill-posedness, consider the system
y 0 = 1/y
which is undefined at y = 0. The general solution is
y = ± (2(t − C))1/2 ,
so that if the condition y(2) = 2 is imposed, the solution will be (2t)1/2 . Clearly, if
the domain specified in a ‘step’ statement includes negative values of t, the generated
solution will be bogus.
In general, when using a constant stepsize you should be careful not to ‘step over’ bad
points or bad regions. When allowed to choose a stepsize adaptively, ode will often
spot bad points, but not always.
3. Critical points.
An autonomous system is one that does not include the independent variable explicitly
on the right-hand side of any differential equation. A critical point for such a system
is a point at which all right-hand sides equal zero. For example, the system
y 0 = 2x
x0 = 2y
has only one critical point, at (x, y) = (0, 0).
A critical point is sometimes referred to as a stagnation point. That is because a system
at a critical point will remain there forever, though a system near a critical point may
undergo more violent motion. Under some circumstances, passing near a critical point
may give rise to a large accumulated error.
As an exercise, solve the system above using ode, with the initial condition x(0) =
y(0) = 0. The solution should be constant in time. Now do the same with points near
the critical point. What happens?
You should always locate the critical points of a system before attempting a solution
with ode. Critical points may be classified (as equilibrium, vortex, unstable, stable,
etc.) and this classification may be of use. To find out more about this, consult any
book dealing with the qualitative theory of differential equations (e.g., Birkhoff and
Rota’s Ordinary Differential Equations, Chapter 6).
4. Unsuitable numerical schemes
If the results produced by ode are bad in the sense that instability appears to be
present, or an unusually small stepsize needs to be chosen needed in order to reduce
the single-step error to manageable levels, it may simply be that the numerical scheme
being used is not suited to the problem. For example, ode currently has no numerical
scheme which handles so-called ‘stiff’ problems very well.
Chapter 8: The ode Program 84
print t, f
step 0, 5
Next make a file named ‘stability’, containing the lines:
: sserr is the bound on the relative single-step error
for sserr
do
ode -r $sserr < qcd
done | spline -n 500 | graph -T X -C
This is a ‘shell script’, which when run will superimpose numerical solutions with
specified bounds on the relative single-step error. To run it, type:
sh stability 1 .1 .01 .001
and a plot of the solutions with the specified error bounds will be drawn. The conver-
gence, showing stability, should be quite illuminating.
Chapter 8: The ode Program 85
Many systems have invariant quantities. For example, if the system is a mathematical
model of a ‘conservative’ physical system then the ‘energy’ (a particular function of the
dependent variables of the system) should be constant in time. In general, knowledge
about the qualitative behavior of any dependent variable may be used to check the
quality of the solution.
Since this grammar is ambiguous, the following table summarizes the precedences and
associativities of operators within expressions. Precedences decrease from top to bottom.
Chapter 8: The ode Program 87
Exponential ^ right
Multiplicative * / left
Additive + - left
As noted in the grammar, there are six types of nontrivial statement. We now explain
the effects (the ‘semantics’) of each type, in turn.
1. IDENTIFIER ’ = <expression>
This defines a first-order differential equation. The derivative of IDENTIFIER is specified
by <expression>. If a dynamic variable does not appear on the left side of a statement
of this form, its derivative is assumed to be zero. That is, it is a symbolic constant.
2. IDENTIFIER = <expression>
This sets the value of IDENTIFIER to the current value of <expression>. Dynamic
variables that have not been initialized in this way are set to zero.
3. step <const> , <const>
4. step <const> , <const> , <const>
A ‘step’ statement causes the numerical scheme to be executed. The first <const> is
the initial value of the independent variable. The second is its final value. The third
is a stepsize; if given, it overrides any stepsize that may be specified on the command
line. Usually the stepsize is not specified, and it varies adaptively as the computation
proceeds.
5. print <printlist> [ every <const> ] [ from <const> ]
A ‘print’ statement controls the content and frequency of the numerical output.
<printlist> is a comma-separated list of IDENTIFIERs, where each IDENTIFIER may
be followed by ‘’’, denoting the derivative, or ‘?’, denoting the relative single-step er-
ror, or ‘!’, denoting the absolute single-step error, or ‘~’, denoting the accumulated
error (not currently implemented). The specified values are printed in the order they
are found. Both the ‘every’ clause and the ‘from’ clause are optional. If the ‘every’
clause is present, a printing occurs every <const> iterations of the numerical algorithm.
The default is to print on every iteration (i.e. ‘every 1’). The first and last values are
always printed. If the ‘from’ clause is present, it means to begin printing when the
independent variable reaches or exceeds <const>. The default is to begin printing
immediately.
If no ‘print’ statement has been supplied, then the independent variable and all de-
pendent variables which have differential equations associated with them are printed.
The independent variable is printed first; the dependent variables follow in the order
their equations were given.
6. examine IDENTIFIER
An ‘examine’ statement, when executed, causes a table of interesting information about
the named variable to be printed on the standard output. For example, if the statement
‘examine y’ were encountered after execution of the ‘ode to Euler’ example discussed
elsewhere, the output would be:
Chapter 8: The ode Program 88
In the ode input language, upper and lower-case letters are distinct. Comments begin
with the character ‘#’ and continue to the end of the line. Long lines may be continued onto
a second line by ending the first line with a backslash (‘\’). That is because the combination
backslash-newline is equivalent to a space.
Spaces or tabs are required in the input whenever they are needed to separate identifiers,
numbers, and keywords from one another. Except as separators, they are ignored.
The file may be viewed or edited with many applications, such as display, which is
part of the free ImageMagick package.
• PNM Plotters. A PNM Plotter produces a single page of output in “portable anymap”
format, and directs it to a file or other specified output stream. There are three types of
portable anymap: PBM (portable bitmap, for monochrome graphics), PGM (portable
graymap), and PPM (portable pixmap, for colored graphics). The output file will be
in whichever of these three formats is most appropriate. The file may be viewed or
edited with many applications, such as display.
• GIF Plotters. A GIF Plotter produces a single page of output in a pseudo-GIF format.
Unlike true GIF format, the pseudo-GIF format does not use LZW compression: it uses
run-length encoding instead. So it does not transgress the Unisys patent that restricts
the use of LZW compression. However, the output file may be viewed or edited with any
application that understands GIF format, such as display. The creation of animated
pseudo-GIFs is supported.
• SVG Plotters. An SVG Plotter produces a single page of output in Scalable Vector
Graphics format and directs it to a file or other specified output stream. SVG is an
XML-based format for vector graphics on the Web, which is being developed by the
Graphics Activity of the W3 Consortium. The output conforms to the 3 March 2000
version of the SVG specification.
• Illustrator Plotters. An Illustrator Plotter produces a single page of output in the
format used by Adobe Illustrator, and directs it to a file or other specified output
stream. The file may be edited with Adobe Illustrator (version 5, and more recent
versions), or other applications.
• Postscript Plotters. A Postscript Plotter produces Postscript output and directs it
to a file or other specified output stream. If only a single page of graphics is drawn
on the Plotter then its output is in EPS (encapsulated Postscript) format, so it may
be included in another document. It may also be edited with the free idraw drawing
editor. See Section E.1 [idraw], page 171.
• CGM Plotters. A CGM Plotter produces output in Computer Graphics Metafile format
and directs it to a file or other specified output stream. By default, binary-encoded
version 3 CGM format is used. The output complies with the WebCGM profile for
Web-based vector graphics, so it may be displayed in any Web browser with WebCGM
support. The CGM Open Consortium has more information on WebCGM.
• Fig Plotters. A Fig Plotter produces a single page of output in Fig format and directs
it to a file or other specified output stream. The output may be edited with the free
xfig drawing editor. The xfig editor can export drawings in various other formats for
inclusion in documents. See Section E.2 [xfig], page 171.
• PCL Plotters. A PCL Plotter produces output in PCL 5 format and directs it to a file
or other specified output stream. PCL 5 is a powerful version of Hewlett–Packard’s
Printer Control Language, which supports vector graphics. The output may be sent to
a PCL 5 device such as a LaserJet printer or high-end inkjet.
• HP-GL Plotters. An HP-GL Plotter produces output in the Hewlett–Packard Graphics
Language (by default, in HP-GL/2), and directs it to a file or other specified output
stream. The output may be imported into another application, or sent to a plotter.
Chapter 9: libplot, a 2-D Vector Graphics Library 92
• ReGIS Plotters. A ReGIS Plotter produces output in ReGIS (remote graphics instruc-
tion set) format and directs it to a file or other specified output stream. The output
may be displayed on any terminal or emulator that understands ReGIS format. This
includes several terminals from DEC (in particular, the VT340, VT330, VT241, and
VT240 terminals), and dxterm, the DECwindows terminal emulation program.
• Tektronix Plotters. A Tektronix Plotter produces output in Tektronix 4014 format and
directs it to a file or other specified output stream. The output may be displayed on
any Tektronix 4014 emulator. Such an emulator is built into xterm, the X Window
System terminal emulation program. The MS-DOS version of kermit also includes
such an emulator.
• Metafile Plotters. A Metafile Plotter produces output in GNU graphics metafile format
and directs it to a file or other specified output stream. This format is an extended
version of the ‘plot(5)’ format found on some other operating systems. (See Appendix D
[Metafiles], page 169.) It may be translated to other formats by an invocation of GNU
plot. (See Chapter 3 [plot], page 30.)
A distinction among these types of Plotter is that all except X and X Drawable Plotters
write graphics to a file or other output stream. An X Plotter pops up its own windows, and
an X Drawable Plotter draws graphics in one or two X drawables.
Another distinction is that the first five types of Plotter (X, X Drawable, PNG, PNM,
and GIF) produce bitmap output, while the remaining types produce output in a vector
graphics format. In bitmap output the structure of the graphical objects is lost, but in a
vector format it is retained.
An additional distinction is that X, X Drawable, ReGIS, Tektronix and Metafile Plotters
are real-time. This means that they draw graphics or write to an output stream as the
drawing operations are invoked on them. The remaining types of Plotter are not real-time,
since their output streams can only be emitted after all functions have been called. For
PNM and GIF Plotters, this is because the bitmap must be constructed before it is written
out. For Illustrator and Postscript Plotters, it is because a ‘bounding box’ line must be
placed at the head of the output file. For a Fig Plotter, it is because color definitions must
be placed at the head of the output file.
The most important operations supported by any Plotter are openpl and closepl,
which open and close it. Graphics may be drawn, and drawing attributes set, only within
an openpl. . . closepl pair. The graphics produced within each openpl. . . closepl pair
constitute a ‘page’. In principle, any Plotter may be opened and closed arbitrarily many
times. An X Plotter displays each page in a separate X window, and Postscript, PCL, and
HP-GL Plotters render each page as a separate physical page. X Drawable, ReGIS and
Tektronix Plotters manipulate a single drawable or display, on which pages are displayed in
succession. Plotters that do not draw in real time (PNG, PNM, GIF, Illustrator, Postscript,
CGM, Fig, PCL, and HP-GL Plotters) may wait until their existence comes to an end (i.e.,
until they are deleted) before outputting their pages of graphics.
In the current release of libplot, Postscript and CGM Plotters delay outputting graph-
ics in this way, but PCL and HP-GL Plotters output each page of graphics individually, i.e.,
when closepl is invoked. PNG, PNM, GIF, SVG, Illustrator and Fig Plotters are similar,
but output only the first page. That is because PNG, PNM, GIF, SVG, Illustrator and Fig
formats support only a single page of graphics.
Chapter 9: libplot, a 2-D Vector Graphics Library 93
multiframe page. As noted above, the pseudo-GIF file produced by a GIF Plotter will
contain only the first page of graphics. But if this page consists of multiple frames, then
each invocation of erase after the first will be treated, by default, as a separator between
successive images.
-lplot -lXaw -lXmu -lXt -lSM -lICE -lXext -lX11 -lpng -lz -lm
These linking options assume that your version of libplot has been compiled with PNG
support; if not, you would omit the ‘-lpng -lz’ options.
As an alternative to the preceding, you may need to use ‘-lplot -lXm -lXt -lXext
-lX11 -lpng -lz -lm’, ‘-lplot -lXm -lXt -lXext -lX11 -lpng -lz -lm -lc -lgen’, or
‘-lplot -lXm -lXt -lXext -lX11 -lpng -lz -lm -lc -lPW’, on systems that provide
Motif widgets instead of Athena widgets. In recent releases of the X Window System, you
would insert ‘-lSM -lICE’. Recent releases of Motif require ‘-lXp’ and possibly ‘-lXpm’
as well.)
On some platforms, the directories in which libplot or the other libraries are stored
must be specified on the command line. For example, the options ‘-lXaw -lXmu -lXt -lSM
-lICE -lXext -lX11’, which specify X Window System libraries, may need to be preceded
by an option like ‘-L/usr/X11/lib’.
On most systems libplot is installed as a shared library. This means that the linking
with your application will take place at run time rather than compile time. The environment
variable LD_LIBRARY_PATH lists the directories which will be searched for shared libraries at
run time. For your application to be executable, this environment variable should include
the directory in which libplot is stored.
void draw_c_curve (plPlotter *plotter, double dx, double dy, int order)
{
if (order >= MAXORDER)
/* continue path along (dx, dy) */
pl_fcontrel_r (plotter, dx, dy);
else
{
draw_c_curve (plotter,
0.5 * (dx - dy), 0.5 * (dx + dy), order + 1);
draw_c_curve (plotter,
0.5 * (dx + dy), 0.5 * (dy - dx), order + 1);
}
}
Chapter 9: libplot, a 2-D Vector Graphics Library 98
int main ()
{
plPlotter *plotter;
plPlotterParams *plotter_params;
As you can see, this application begins by creating a plPlotterParams object to hold
Plotter parameters, and sets the PAGESIZE parameter. It then calls the pl_newpl_r function
to create a Postscript Plotter. The Postscript Plotter will produce output for a US letter-
sized page, though any other standard page size, e.g., "a4", could be substituted. This
would be arranged by altering the call to pl_setplparam. The PAGESIZE parameter is
Chapter 9: libplot, a 2-D Vector Graphics Library 99
one of several Plotter parameters that an application programmer may set. For a list, see
Section 9.5 [Plotter Parameters], page 136.
After the Plotter is created, the application opens it and draws the “C” curve recursively.
The drawing of the curve is accomplished by calling the pl_fmove_r function to position the
Plotter’s graphics cursor, and then calling draw_c_curve. This subroutine repeatedly calls
pl_fcontrel_r. The pl_fcontrel_r function continues a path by adding a line segment
to it. The endpoint of each line segment is specified in relative floating point coordinates,
i.e., as a floating point offset from the previous cursor position. After the “C” curve is drawn,
the Plotter is closed by calling pl_closepl_r, which automatically invokes pl_endpath_r
to end the path. A Postscript file is written to standard output when pl_deletepl_r is
called to delete the Plotter.
Specifying "png", "pnm", "gif", "svg", "ai", "cgm", "fig", "pcl", "hpgl", "regis", "tek",
or "meta" as the first argument in the call to pl_newpl_r, instead of "ps", would yield a
Plotter that would write graphics to standard output in the specified format, instead of
Postscript. The PAGESIZE parameter is relevant to the "svg", "ai", "cgm", "fig", "pcl",
and "hpgl" output formats, but is ignored for the others. Specifying "meta" as the Plotter
type may be useful if you wish to avoid recompilation for different output devices. Graphics
metafile output may be piped to the plot utility and converted to any other supported
output format, or displayed in an X window. See Chapter 3 [plot], page 30.
If "X" were specified as the first argument of pl_newpl_r, the curve would be drawn
in a popped-up X window, and the output stream argument would be ignored. Which
X Window System display the window would pop up on would be determined by the
DISPLAY parameter, or if that parameter were not set, by the DISPLAY environment vari-
able. The size of the X window would be determined by the BITMAPSIZE parameter, or
if that parameter were not set, by the BITMAPSIZE environment variable. The default
value is "570x570". For the "png", "pnm", and "gif" Plotter types, the interpretation of
BITMAPSIZE is similar.
You could also specify "Xdrawable" as the Plotter type. For you to make this work,
you would need to know a bit about X Window System programming. You would need to
create at least one X drawable (i.e., window or a pixmap), and by invoking pl_setplparam
before pl_newpl_r is called, set it as the value of the parameter XDRAWABLE_DRAWABLE1 or
XDRAWABLE_DRAWABLE2. For the parameters that affect X Drawable Plotters, see Section 9.5
[Plotter Parameters], page 136.
The following is another sample application, written in C, that invokes libplot opera-
tions to draw vector graphics. It draws a spiral consisting of elliptically boxed text strings,
each of which reads "GNU libplot!". This figure will be sent to standard output in Postscript
format.
#include <stdio.h>
#include <plot.h>
#include <math.h>
#define SIZE 100.0 /* nominal size of user coordinate frame */
#define EXPAND 2.2 /* expansion factor for elliptical box */
Chapter 9: libplot, a 2-D Vector Graphics Library 100
int main()
{
plPlotter *plotter;
plPlotterParams *plotter_params;
int i;
individual characters from an X11R6 display, rather than retrieving an entire font. If this
feature is available, the X Plotter will automatically take advantage of it to save time.
int main ()
{
int i, j;
plPlotter *plotter;
plPlotterParams *plotter_params;
Chapter 9: libplot, a 2-D Vector Graphics Library 103
/* delete Plotter */
if (pl_deletepl_r (plotter) < 0)
{
fprintf (stderr, "Couldn’t delete Plotter\n");
return 1;
}
return 0;
}
As you will see if you run this program, the filling of the compound path takes place in
a visually pleasing way: alternating annular regions are filled. That is because libplot’s
default fill rule is "even-odd". Since a compound path’s constituent simple paths must
always be nested, it is easy for libplot to determine which regions between them are
‘even’ and which are ‘odd’. It is the latter that are filled.
The above program includes many invocations of orientation. The value of the modal
‘orientation’ attribute (1, meaning counterclockwise, or −1, meaning clockwise) applies to
subsequently drawn boxes, circles, and ellipses. If "even-odd" filling is used, they have no
effect. But if the fill rule for the compound path is set to "nonzero-winding" by an initial
call to fillmod, these calls to orientation will arrange matters so that alternating annular
regions are filled, just as if "even-odd" filling were used.
If the preceding paragraph is mysterious, it would be wise to consult a good book on
Postscript programming, or any other reference on the subject of ‘winding numbers’.
int main()
{
plPlotter *plotter;
plPlotterParams *plotter_params;
The program will print two strings and draw the baseline for each. The first string will be
left-justified at position (1.0,11.0), which is one inch below the top of the page. The second
string will be right-justified at position (7.5,1.0), which is one inch above the bottom of the
page. For both strings, the ’x’ argument of pl_alabel_r specifies the vertical positioning:
it requests that the baseline of the string, rather than (say) its top or bottom, be positioned
at the current vertical position.
The preceding discussion and sample program dealt with the portrait orientation of the
printed page, which is the default. Drawing in landscape orientation is only slightly more
complicated. For this, the viewport would be rotated on the page by setting the Plotter
parameter ROTATION. Its default value is "0" (or "no"), but any other rotation angle may
be specified. To obtain landscape orientation, one would specify "90" (for historical reasons,
"yes" is equivalent to "90"). The following program is a modified version of the preceding,
showing how a landscape orientation would be produced.
Chapter 9: libplot, a 2-D Vector Graphics Library 106
#include <stdio.h>
#include <plot.h>
int main()
{
plPlotter *plotter;
plPlotterParams *plotter_params;
page of graphics, i.e., only the graphics contained in the first openpl. . . closepl pair
appear in the output file. In this, it resembles other Plotters that do not plot in real time.
(2) Within this page, each invocation of erase is normally treated as the beginning of a
new image in the output file. There is an exception to this: the first invocation of erase
begins a new image only if something has already been drawn.
The reason for the exception is that many programmers who use libplot are in the
habit of invoking erase immediately after a Plotter is opened. That is not a bad habit,
since a few types of Plotter (e.g., X Drawable and Tektronix Plotters) are ‘persistent’ in
the sense that previously drawn graphics remain visible.
The following program creates a simple animated pseudo-GIF, 150 pixels wide and 100
pixels high.
#include <stdio.h>
#include <plot.h>
int main()
{
plPlotter *plotter;
plPlotterParams *plotter_params;
int i;
The animated pseudo-GIF will be written to standard output. It will consist of twelve
images, showing the counterclockwise rotation of a black-filled red ellipse through 180 de-
grees. The pseudo-GIF will be ‘looped’ (see below), so the ellipse will rotate repeatedly.
The parameters of the ellipse are expressed in terms of user coordinates, not pixel coor-
dinates. But the call to pl_fspace_r defines user coordinates that are effectively the same
as pixel coordinates. In the user coordinate system, the lower left corner of the rectangle
mapped into the 150x100 pseudo-GIF image is given coordinates (−0.5,−0.5), and the up-
per right corner is given coordinates (149.5,99.5). So individual pixels may be addressed in
terms of integer user coordinates. For example, invoking pl_point_r(plotter,0,0) and
pl_point_r(plotter,149,99) would set the pixels in the lower left and upper right corners
of the image to the current pen color.
Besides BITMAPSIZE and BG_COLOR, there are several important GIF Plotter parameters
that may be set with the pl_setplparam function. The TRANSPARENT_COLOR parameter may
be set to the name of a color. Pixels in a pseudo-GIF that have that color will be treated
as transparent by most software. This is usually used to create a transparent background.
In the example above, the background color is specified as orange, but the transparent color
is also specified as orange. So the background will not actually be displayed.
The GIF_ITERATIONS parameter, if set, specifies the number of times that a multi-frame
pseudo-GIF should be looped. The GIF_DELAY parameter specifies the number of hun-
dredths of a seconds that should elapse between successive images.
The INTERLACE parameter is sometimes useful. If it is set to "yes", the pseudo-GIF will
be interlaced. This is of greatest value for single-frame GIFs. For full details on Plotter
parameters, see Section 9.5 [Plotter Parameters], page 136.
The following is a sample application, written in C, that produces an animation for the
X Window System. It displays a ‘drifting eye’. As the eye drifts across a popped-up window
from left to right, it slowly rotates. After the eye has drifted across twice, the window will
vanish.
#include <stdio.h>
#include <plot.h>
Chapter 9: libplot, a 2-D Vector Graphics Library 109
int main ()
{
plPlotter *plotter;
plPlotterParams *plotter_params;
int i = 0, j;
As you can see, this application begins by calling pl_setplparam several times to set
Plotter parameters, and then calls pl_newpl_r to create an X Plotter. The X Plotter
window will have size 300x150 pixels. This window will vanish when the Plotter is deleted.
If the VANISH_ON_DELETE parameter were not set to "yes", the window would remain on
the screen until removed by the user (by typing ‘q’ in it, or by clicking with a mouse).
After the Plotter is created, it is selected for use and opened. When pl_openpl_r is
called, the window pops up, and the animation begins. In the body of the for loop there
is a call to pl_erase_r, and also a sequence of libplot operations that draws the eye.
The pen color and fill color are changed twice with each passage through the loop. You
may wish to experiment with the animation parameters to produce the best effects on your
video hardware.
The positions of the objects that are plotted in the animation are expressed in terms of
user coordinates, not pixel coordinates. But the call to pl_fspace_r defines user and pixel
coordinates to be effectively the same. User coordinates are chosen so that the lower left
corner of the rectangle mapped to the X window is (−0.5,−0.5) and the upper right corner
is (299.5,149.5). Since this agrees with the window size, individual pixels may be addressed
in terms of integer user coordinates. For example, pl_point_r(plotter,299,149) would
set the pixel in the upper right corner of the window to the current pen color.
The following is another sample animation, this time of a rotating letter ‘A’.
#include <stdio.h>
#include <plot.h>
Chapter 9: libplot, a 2-D Vector Graphics Library 111
int main()
{
plPlotter *plotter;
plPlotterParams *plotter_params;
int angle = 0;
This animation serves as a good test of the capabilities of an X Window System dis-
play. On a modern X11R6 display, animation will be smooth and fast. That is because
X11R6 displays can retrieve individual characters from a font without retrieving the entire
font. If your X display does not support the "NewCenturySchlbk-Roman" font, you may
substitute most core X fonts, such as the widely available scalable font "charter-medium-r-
normal", or the traditional screen font "fixed". For the format of font names, see Section A.3
[Text Fonts in X], page 150. If the X Plotter is unable to retrieve the font you specify, it will
first attempt to use a default scalable font ("Helvetica", interpreted in the context of the
X Window System as "helvetica-medium-r-normal"). If that too fails, it will use a default
Hershey vector font ("HersheySerif") instead.
Chapter 9: libplot, a 2-D Vector Graphics Library 112
Animations that use Hershey fonts are normally faster than ones that use Postscript
fonts or other X Window System fonts, since the Hershey fonts are constructed from line
segments. Rasterizing line segments can be done rapidly.
If you are writing an application that performs a lengthy sequence of drawing opera-
tions on an X Plotter, you may find it useful to set the Plotter parameter X_AUTO_FLUSH to
"no". By default, an X Plotter flushes all graphics to its X Window System display after
each drawing operation. This flushing ensures that graphics are visible to the user imme-
diately after they are drawn. However, it sometimes slows down the rendering process. For
additional details on Plotter parameters, see Section 9.5 [Plotter Parameters], page 136.
plPlotter *plotter;
int green = 0; /* draw in green, not red? */
#define MAXORDER 12
void draw_c_curve (double dx, double dy, int order)
{
if (order >= MAXORDER)
/* continue path along (dx, dy) */
pl_fcontrel_r (plotter, dx, dy);
Chapter 9: libplot, a 2-D Vector Graphics Library 113
else
{
draw_c_curve (0.5 * (dx - dy), 0.5 * (dx + dy), order + 1);
draw_c_curve (0.5 * (dx + dy), 0.5 * (dy - dx), order + 1);
}
}
return 1;
}
Even if you are not familiar with X Window System programming, the structure of this
application should be clear. It defines three callbacks: Redraw, Toggle, and Quit. They are
invoked respectively in response to (1) a window expose event or mouse click, (2) a mouse
click, and (3) a typed ‘q’. The first drawing of the ‘C’ curve (in red) takes place because
the window receives an initial expose event.
This example could be extended to take window resizing into account. Actually,
X Drawable Plotters are usually used to draw vector graphics in off-screen pixmaps rather
than on-screen windows. Pixmaps, unlike windows, are never resized.
PlotterParams ¶ms);
Plotter(FILE *infile, FILE *outfile, FILE *errfile,
PlotterParams ¶ms);
are provided for the base Plotter class, and similarly for each of its derived classes. So, for
example, both
PSPlotter plotter(cin, cout, cerr, params);
and
PSPlotter plotter(stdin, stdout, stderr, params);
are possible declarations of a Postscript Plotter that writes to standard output. In the
iostream case, an ostream with a null stream buffer may be specified as the output stream
and/or the error stream, to request that no output take place. In the FILE pointer case,
specifying a null FILE pointer would accomplish the same thing. Instances of the XPlotter
and XDrawablePlotter classes always ignore the output stream argument, since they write
graphics to an X Display rather than to a stream.
The PlotterParams class supports copying and assignment, but has only a single public
function member, setplparam. The following is a formal description.
int PlotterParams::setplparam (const char *parameter, void *value);
Set the value of the Plotter parameter parameter to value. For most parameters,
value should be a char *, i.e., a string. Unrecognized parameters are ignored.
For a list of the recognized parameters and their meaning, see Section 9.5 [Plot-
ter Parameters], page 136.
Like the plPlotterParams datatype and the function pl_setplparam of the C binding,
the PlotterParams class and the PlotterParams::setplparam function of the C++ binding
give the programmer fine control over the parameters of subsequently created Plotters. The
parameter values used by any Plotter are constant over the lifetime of the Plotter, and
are those that were specified when the Plotter was created. If at Plotter creation time a
parameter has not been set in the specified PlotterParams object, its default value will
be used, unless the parameter is string-valued and there is an environment variable of the
same name, in which case the value of that environment variable will be used.
Once set in a PlotterParams object, a parameter may be unset by the programmer
by invoking PlotterParams::setplparam with a value argument of NULL. This further
increases flexibility.
There is an alternative (older) way of constructing a Plotter, which is deprecated but
still supported. By using either of
Plotter(istream& instream, ostream& outstream, ostream& errstream);
Plotter(FILE *infile, FILE *outfile, FILE *errfile);
one may construct a Plotter without specifying a PlotterParams object. In this case the
parameter values for the Plotter are copied from static storage. A parameter may be set in
static storage by invoking a static member function of the Plotter class, Plotter::parampl,
which has declaration
int PlotterParams::parampl (const char *parameter, void *value);
This alternative way of creating a Plotter is not thread-safe, which is why it is deprecated.
Chapter 9: libplot, a 2-D Vector Graphics Library 117
void draw_c_curve (Plotter& plotter, double dx, double dy, int order)
{
if (order >= maxorder)
plotter.fcontrel (dx, dy); // continue path along (dx, dy)
else
{
draw_c_curve (plotter,
0.5 * (dx - dy), 0.5 * (dx + dy), order + 1);
draw_c_curve (plotter,
0.5 * (dx + dy), 0.5 * (dy - dx), order + 1);
}
}
int main ()
{
// set a Plotter parameter
PlotterParams params;
params.setplparam ("PAGESIZE", (char *)"letter");
int space (int x0, int y0, int x1, int y1);
int fspace (double x0, double y0, double x1, double y1);
space and fspace take two pairs of arguments, specifying the positions of the
lower left and upper right corners of a rectangular window in the user coordinate
system that will be mapped to the ‘viewport’: the rectangular portion of the
output device that graphics will be drawn in. The default window is a square,
with opposite corners (0,0) and (1,1).
In mathematical terms, calling space or fspace sets the affine transformation
from user coordinates to device coordinates. That is, it sets the transformation
matrix attribute for each object subsequently drawn on the display. Either
space or fspace would usually be invoked at the beginning of each page of
graphics, i.e., immediately after the call to openpl. Additional calls to space or
fspace are allowed, and there are several “mapping functions” that also affect
the transformation matrix attribute. See Section 9.4.4 [Mapping Functions],
page 135.
Note that the size and location of the viewport depend on the type of Plotter,
and on the Plotter parameters that are specified at Plotter creation time. For
example, the default viewport used by any Illustrator, Postscript, Fig, PCL,
and HP-GL Plotter is a square whose size depends on the Plotter’s page type.
See Appendix C [Page and Viewport Sizes], page 167.
int space2 (int x0, int y0, int x1, int y1, int x2, int y2);
int fspace2 (double x0, double y0, double x1, double y1, double x2, double y2);
space2 and fspace2 are extended versions of space and fspace. Their argu-
ments are the three defining vertices of an parallelogram-shaped window in the
user coordinate system. The specified vertices are the lower left, the lower right,
and the upper left. This window will be mapped affinely onto the viewport:
the rectangular portion of the output device that graphics will be drawn in.
The ‘maybe’ value is returned for most capabilities by Metafile Plotters, which
do no drawing themselves. The output of a Metafile Plotter must be translated
to another format, or displayed, by invoking plot.
int flushpl ();
flushpl flushes (i.e., pushes onward) all previously plotted objects to the graph-
ics display. This is useful only if the affected Plotter is one that does real-time
plotting (X Plotters, X Drawable Plotters, ReGIS Plotters, Tektronix Plotters,
and Metafile Plotters). It ensures that all previously plotted objects are visible
to the user. On Plotters that do not do real-time plotting, this operation has
no effect.
int closepl ();
closepl closes a Plotter, i.e., ends a page of graphics. If a path is in progress,
it is first ended and plotted, as if endpath had been called. A negative return
value indicates the Plotter could not be closed.
In the present release of libplot, some Plotters output each page of graphics
immediately after it is plotted, i.e., when closepl is invoked to end the page.
That is the case with PCL and HP-GL Plotters, in particular. Plotters that
can output only a single page of graphics (PNG, PNM, GIF, SVG, Illustrator,
and Fig Plotters) do so immediately after the first page is plotted, i.e., when
closepl is invoked for the first time. Postscript and CGM Plotters store all
pages of graphics internally, and do not produce output until they are deleted.
older C bindings, see Section 9.2.2 [Older C APIs], page 95. In the C++ binding, these are
member functions of the Plotter class and its subclasses, and the prefix and suffix are not
used.
int alabel (int horiz justify, int vert justify, const char *s);
alabel takes three arguments horiz justify, vert justify, and s, which specify
an ‘adjusted label,’ i.e., a justified text string. The path under construction
(if any) is ended and drawn, as if endpath had been called, and the string s is
drawn according to the specified justifications. If horiz justify is equal to ‘l’,
‘c’, or ‘r’, then the string will be drawn with left, center or right justification,
relative to the current graphics cursor position. If vert justify is equal to ‘b’, ‘x’,
‘c’, ‘C’, or ‘t’, then the bottom, baseline, center, cap line, or top of the string
will be placed even with the current graphics cursor position. The graphics
cursor is moved to the right end of the string if left justification is specified,
and to the left end if right justification is specified.
The string may contain escape sequences of various sorts (see Section A.4 [Text
String Format], page 151), though it should not contain line feeds or carriage
returns. In fact it should include only printable characters, from the byte ranges
0x20. . . 0x7e and 0xa0. . . 0xff. The string may be plotted at a nonzero angle,
if textangle has been called.
int arc (int xc, int yc, int x0, int y0, int x1, int y1);
int farc (double xc, double yc, double x0, double y0, double x1, double y1);
int arcrel (int xc, int yc, int x0, int y0, int x1, int y1);
int farcrel (double xc, double yc, double x0, double y0, double x1, double y1);
arc and farc take six arguments specifying the beginning (x0, y0), end (x1,
y1), and center (xc, yc) of a circular arc. If the graphics cursor is at (x0, y0)
and a path is under construction, then the arc is added to the path. Otherwise
the current path (if any) is ended and drawn, as if endpath had been called,
and the arc begins a new path. In all cases the graphics cursor is moved to (x1,
y1).
The direction of the arc (clockwise or counterclockwise) is determined by the
convention that the arc, centered at (xc, yc), sweep through an angle of at most
180 degrees. If the three points appear to be collinear, the direction is taken
to be counterclockwise. If (xc, yc) is not equidistant from (x0, y0) and (x1,
y1) as it should be, it is corrected by being moved to the closest point on the
perpendicular bisector of the line segment joining (x0, y0) and (x1, y1). arcrel
and farcrel are similar to arc and farc, but use cursor-relative coordinates.
int bezier2 (int x0, int y0, int x1, int y1, int x2, int y2);
int fbezier2 (double x0, double y0, double x1, double y1, double x2, double y2);
int bezier2rel (int x0, int y0, int x1, int y1, int x2, int y2);
int fbezier2rel (double x0, double y0, double x1, double y1, double x2, double y2);
bezier2 and fbezier2 take six arguments specifying the beginning p0=(x0,
y0) and end p2=(x2, y2) of a quadratic Bezier curve, and its intermediate
control point p1=(x1, y1). If the graphics cursor is at p0 and a path is under
construction, then the curve is added to the path. Otherwise the current path
(if any) is ended and drawn, as if endpath had been called, and the curve begins
Chapter 9: libplot, a 2-D Vector Graphics Library 124
a new path. In all cases the graphics cursor is moved to p2. bezier2rel and
fbezier2rel are similar to bezier2 and fbezier2, but use cursor-relative
coordinates.
The quadratic Bezier curve is tangent at p0 to the line segment joining p0 to p1,
and is tangent at p2 to the line segment joining p1 to p2. So it fits snugly into
a triangle with vertices p0, p1, and p2.
When using a PCL Plotter to draw Bezier curves on a LaserJet III, you should
set the parameter PCL_BEZIERS to "no". That is because the LaserJet III,
which was Hewlett–Packard’s first PCL 5 printer, does not recognize the Bezier
instructions supported by later PCL 5 printers. See Section 9.5 [Plotter Pa-
rameters], page 136.
int bezier3 (int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
int fbezier3 (double x0, double y0, double x1, double y1, double x2, double y2, double
x3, double y3);
int bezier3rel (int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
int fbezier3rel (double x0, double y0, double x1, double y1, double x2, double y2,
double x3, double y3);
bezier3 and fbezier3 take eight arguments specifying the beginning p0=(x0,
y0) and end p3=(x3, y3) of a cubic Bezier curve, and its intermediate control
points p1=(x1, y1) and p2=(x2, y2). If the graphics cursor is at p0 and a
path is under construction, then the curve is added to the path. Otherwise the
current path (if any) is ended and drawn, as if endpath had been called, and
the curve begins a new path. In all cases the graphics cursor is moved to p3.
bezier3rel and fbezier3rel are similar to bezier3 and fbezier3, but use
cursor-relative coordinates.
The cubic Bezier curve is tangent at p0 to the line segment joining p0 to p1,
and is tangent at p3 to the line segment joining p2 to p3. So it fits snugly into
a quadrangle with vertices p0, p1, p2, and p3.
When using a PCL Plotter to draw Bezier curves on a LaserJet III, you should
set the parameter PCL_BEZIERS to "no". That is because the LaserJet III,
which was Hewlett–Packard’s first PCL 5 printer, does not recognize the Bezier
instructions supported by later PCL 5 printers. See Section 9.5 [Plotter Pa-
rameters], page 136.
int box (int x1, int y1, int x2, int y2);
int fbox (double x1, double y1, double x2, double y2);
int boxrel (int x1, int y1, int x2, int y2);
int fboxrel (double x1, double y1, double x2, double y2);
box and fbox take four arguments specifying the starting corner (x1, y1) and
opposite corner (x2, y2) of a ‘box’, or rectangle. The path under construction
(if any) is ended, and the box is drawn as a new path. This path is also ended,
and the graphics cursor is moved to the midpoint of the box. boxrel and
fboxrel are similar to box and fbox, but use cursor-relative coordinates.
Chapter 9: libplot, a 2-D Vector Graphics Library 125
(xc, yc). ellipserel and fellipserel are similar to ellipse and fellipse,
but use cursor-relative coordinates.
int endpath ();
endpath terminates the path under construction, if any, and draws it. It also
removes the path from the current graphics context, so that a new path may
be constructed.
The path under construction may be a simple path, or a compound path con-
structed with the aid of endsubpath (see below). A simple path is constructed
by one or more successive calls to cont, line, arc, ellarc, bezier2, bezier3,
and/or their floating point counterparts. A simple path may also be constructed
by a single call to circle, ellipse, or box.
It is often not necessary to call endpath explicitly, since it is frequently called
automatically. It will be called if any non-path object is drawn, if any path-
related drawing attribute is set, or if move or fmove is invoked to set the cursor
position. It will also be called if restorestate is called to pop a graphics
context off the stack, and if closepl is called to end a page of graphics. So it is
seldom necessary to call endpath explicitly. However, if a Plotter plots objects
in real time, calling endpath will ensure that a completed path is drawn on the
graphics display without delay.
int endsubpath ();
endsubpath terminates the simple path under construction, if any, and signals
that the construction of the next simple path in a compound path is to begin.
Immediately after endsubpath is called, it is permissible to call move or fmove
to reposition the graphics cursor. (At other times in the drawing of a com-
pound path, calling move or fmove would force a premature end to the path,
by automatically invoking endpath.)
int label (const char *s);
label takes a single string argument s and draws the text contained in s at
the current graphics cursor position. The text is left justified, and the graphics
cursor is moved to the right end of the string. This function is provided for back-
ward compatibility; the function call label(s) is equivalent to alabel(‘l’,‘x’,s).
int labelwidth (const char *s);
double flabelwidth (const char *s);
labelwidth and flabelwidth are not really object-drawing functions: they are
query functions. They compute and return the width of a string in the current
font, in the user coordinate system. The string is not drawn.
int line (int x1, int y1, int x2, int y2);
int fline (double x1, double y1, double x2, double y2);
int linerel (int x1, int y1, int x2, int y2);
int flinerel (double x1, double y1, double x2, double y2);
line and fline take four arguments specifying the start point (x1, y1) and
end point (x2, y2) of a line segment. If the graphics cursor is at (x1, y1) and
a path is under construction, the line segment is added to it. Otherwise the
path under construction (if any) is ended and drawn, as if endpath had been
Chapter 9: libplot, a 2-D Vector Graphics Library 127
called, and the line segment begins a new path. In all cases the graphics cursor
is moved to (x2, y2). linerel and flinerel are similar to line and fline,
but use cursor-relative coordinates.
int marker (int x, int y, int type, int size);
int fmarker (double x, double y, int type, double size);
int markerrel (int x, int y, int type, int size);
int fmarkerrel (double x, double y, int type, double size);
marker and fmarker take four arguments specifying the position (x,y) of a
marker symbol, its type, and its font size in user coordinates. The path under
construction (if any) is ended and drawn, as if endpath had been called, and the
marker symbol is plotted. The graphics cursor is moved to (x,y). markerrel
and fmarkerrel are similar to marker and fmarker, but use cursor-relative
coordinates for the position (x,y).
A marker symbol is a visual representation of a point, which is visible on all
types of Plotter. In this it differs from the points produced by the point func-
tion (see below). Marker symbol types 0. . . 31 are taken from a standard set,
and marker symbol types 32 and above are interpreted as the index of a char-
acter in the current text font. See Section A.5 [Marker Symbols], page 163.
int point (int x, int y);
int fpoint (double x, double y);
int pointrel (int x, int y);
int fpointrel (double x, double y);
point and fpoint take two arguments specifying the coordinates (x, y) of a
point. The path under construction (if any) is ended and drawn, as if endpath
had been called, and the point is plotted. The graphics cursor is moved to
(x, y). pointrel and fpointrel are similar to point and fpoint, but use
cursor-relative coordinates.
‘Point’ is a misnomer. Any Plotter that produces a bitmap, i.e., an X Plotter,
an X Drawable Plotter, a PNG Plotter, a PNM Plotter, or a GIF Plotter, draws
a point as a single pixel. Most other Plotters draw a point as a small solid circle,
usually so small as to be invisible. So point should really be called pixel.
"pl " and ends with " r". (" r" stands for ‘revised’ or ‘reentrant’.) For information on
older C bindings, see Section 9.2.2 [Older C APIs], page 95. In the C++ binding, these are
member functions of the Plotter class and its subclasses, and the prefix and suffix are not
used.
int capmod (const char *s);
capmod terminates and draws the path under construction (if any), as if
endpath had been called, and sets the cap mode (i.e., cap style) for all paths
subsequently drawn on the graphics display. Recognized styles are "butt" (the
default), "round", and "projecting". The three styles are visibly distinct only
if the line thickness is fairly large. Butt caps do not extend beyond the end of
the path. The other two kinds do, however. Round caps are filled semicircles,
and projecting caps are filled rectangular regions that extend a distance equal
to half the line width beyond the end of the path.
PNG, PNM, GIF, PCL, and HP-GL Plotters support a fourth cap mode, "tri-
angular". (For all but PCL and HP-GL Plotters, the support is currently only
partial.) Plotters other than these treat "triangular" as equivalent to "round".
This function has no effect on ReGIS or Tektronix Plotters. Also, it has no
effect on HP-GL Plotters if the parameter HPGL_VERSION is set to a value less
than "2" (the default), or on CGM Plotters if the parameter CGM_MAX_VERSION
is set to a value less than "3". See Section 9.5 [Plotter Parameters], page 136.
int color (int red, int green, int blue);
color is a convenience function. Calling color is equivalent to calling both
pencolor and fillcolor, to set both the the pen color and fill color of all
objects subsequently drawn on the graphics display. Note that the physical fill
color depends also on the fill level, which is specified by calling filltype.
int colorname (const char *name);
colorname is a convenience function. Calling colorname is equivalent to calling
both pencolorname and fillcolorname, to set both the the pen color and fill
color of all objects subsequently drawn on the graphics display. Note that the
physical fill color depends also on the fill level, which is specified by calling
filltype.
int fillcolor (int red, int green, int blue);
fillcolor terminates and draws the path under construction (if any), as if
endpath had been called, and sets the fill color for all paths subsequently drawn
on the graphics display, using a 48-bit RGB color model. The arguments red,
green and blue specify the red, green and blue intensities of the fill color. Each is
an integer in the range 0x0000. . . 0xffff, i.e., 0. . . 65535. The choice (0, 0, 0)
signifies black, and the choice (65535, 65535, 65535) signifies white. Note that
the physical fill color depends also on the fill level, which is specified by calling
filltype.
int fillcolorname (const char *name);
fillcolorname sets the fill color of all paths subsequently drawn on the graph-
ics display to be name. Unrecognized colors are interpreted as "black". For
information on what color names are recognized, see Appendix B [Color Names],
Chapter 9: libplot, a 2-D Vector Graphics Library 129
page 166. A 24-bit RGB color may also be specified as a six-digit hexadecimal
string, e.g., "#c0c0c0".
Note that the physical fill color depends also on the fill level, which is specified
by calling filltype.
Plotter-dependent (most Plotters do not draw text strings if the font size is
zero).
int joinmod (const char *s);
joinmod terminates and draws the path under construction (if any), as if
endpath had been called, and sets the join mode (i.e., join style) for all paths
subsequently drawn on the graphics display. Recognized styles are "miter"
(the default), "round", and "bevel". The three styles are visibly distinct only
if the line thickness is fairly large. Mitered joins are sharp, rounded joins are
round, and beveled joins are squared off. However, unusually sharp joins are
never mitered: instead, they are beveled. The angle at which beveling replaces
mitering may be specified by calling fmiterlimit.
PNG, PNM, GIF, PCL, and HP-GL Plotters support a fourth join mode, "tri-
angular". Other Plotters treat "triangular" as equivalent to "round".
This function has no effect on ReGIS or Tektronix Plotters. Also, it has no
effect on HP-GL Plotters if the parameter HPGL_VERSION is set to a value less
than "2" (the default), or on CGM Plotters if the parameter CGM_MAX_VERSION
is set to a value less than "3". See Section 9.5 [Plotter Parameters], page 136.
int linedash (int n, const int *dashes, int offset);
int flinedash (int n, const double *dashes, double offset);
linedash and flinedash terminate and draw the path under construction
(if any), as if endpath had been called, and set the line style for all paths
subsequently drawn on the graphics display. They provide much finer control
of dash patterns than the linemod function (see below) provides. dashes should
be an array of length n. Its elements, which should be positive, are interpreted
as distances in the user coordinate system. Along any path, circle, or ellipse,
the elements dashes[0]. . . dashes[n-1] alternately specify the length of a dash
and the length of a gap between dashes. When the end of the array is reached,
the reading of the array wraps around to the beginning. If the array is empty,
i.e., n equals zero, there is no dashing: the drawn line is solid.
The offset argument specifies the ‘phase’ of the dash pattern relative to the
start of the path. It is interpreted as the distance into the dash pattern at
which the dashing should begin. For example, if offset equals zero then the
path will begin with a dash, of length dashes[0] in user space. If offset equals
dashes[0] then the path will begin with a gap of length dashes[1], and so forth.
offset is allowed to be negative.
Not all Plotters fully support linedash and flinedash. PCL and HP-GL
Plotters cannot dash with a nonzero offset, and in the dash patterns used by
X and X Drawable Plotters, each dash or gap has a maximum length of 255
pixels. linedash and flinedash have no effect at all on Tektronix, ReGIS,
and Fig Plotters. Also, they have no effect on HP-GL Plotters for which the
parameter HPGL_VERSION is less than "2" (the default), or on CGM Plotters
for which the parameter CGM_MAX_VERSION is less than "3". For information
on Plotter parameters, see Section 9.5 [Plotter Parameters], page 136.
Warning: If the transformation from the user coordinate system to the device
coordinate system is anisotropic, each dash pattern should ideally be drawn on
Chapter 9: libplot, a 2-D Vector Graphics Library 132
the graphics display with a length that depends on its direction. But currently,
only SVG and Postscript Plotters do this. Other Plotters always draw any
specified dash pattern with the same length, irrespective of its direction. The
length that is used is the minimum length, in the device coordinate system,
that can correspond to the specified dash pattern length in the user coordinate
system.
minimum dimension.) But for Plotters that produce bitmaps, i.e., X Plotters,
X Drawable Plotters, PNG Plotters, PNM Plotters, and GIF Plotters, it is zero.
By convention, a zero-thickness line is the thinnest line that can be drawn.
However, the drawing editors idraw and xfig treat zero-thickness lines as in-
visible. So when producing editable graphics with a Postscript or Fig Plotter,
using a zero line thickness may not be desirable.
Tektronix and ReGIS Plotters do not support drawing with other than a default
thickness, and HP-GL Plotters do not support doing so if the parameter HPGL_
VERSION is set to a value less than "2" (the default; see Section 9.5 [Plotter
Parameters], page 136).
Warning: If the transformation from the user coordinate system to the device
coordinate system is anisotropic, each line segment in a polygonal path should
ideally be drawn on the graphics display with a thickness that depends on
its direction. But currently, only SVG and Postscript Plotters do this. Other
Plotters draw all line segments in a path with the same thickness. The thickness
that is used is the minimum thickness, in the device coordinate system, that
can correspond to the specified line thickness in the user coordinate system.
int move (int x, int y);
int fmove (double x, double y);
int moverel (int x, int y);
int fmoverel (double x, double y);
move and fmove take two arguments specifying the coordinates (x, y) of a point
to which the graphics cursor should be moved. The path under construction
(if any) is ended and drawn, as if endpath had been called, and the graphics
cursor is moved to (x, y). This is equivalent to lifting the pen on a plotter and
moving it to a new position, without drawing any line. moverel and fmoverel
are similar to move and fmove, but use cursor-relative coordinates.
When a new page of graphics is begun by invoking openpl, the cursor is initially
at the point (0,0) in user space. Most of the drawing functions reposition the
cursor. See Section 9.4.2 [Drawing Functions], page 122.
int orientation (int direction);
orientation sets the orientation for all circles, ellipses, and boxes subsequently
drawn on the graphics display. direction must be 1, meaning counterclockwise,
or −1, meaning clockwise. The default is 1.
orientation will have a visible effect on a circle, ellipse, or box only if it is
dashed, or if it is one of the simple paths in a filled compound path. Its effects
on filling, when the "nonzero-winding" fill rule is used, are dramatic, since it is
the orientation of each simple path in a compound path that determines which
points are ‘inside’ and which are ‘outside’.
int pencolor (int red, int green, int blue);
pencolor terminates and draws the path under construction (if any), as if
endpath had been called, and sets the pen color for all objects subsequently
drawn on the graphics display, using a 48-bit RGB color model. The arguments
red, green and blue specify the red, green and blue intensities of the pen color.
Chapter 9: libplot, a 2-D Vector Graphics Library 134
Each is an integer in the range 0x0000. . . 0xffff, i.e., 0. . . 65535. The choice
(0, 0, 0) signifies black, and the choice (65535, 65535, 65535) signifies white.
HP-GL Plotters support drawing with a white pen only if the value of the
parameter HPGL_VERSION is "2" (the default), and the value of the parameter
HPGL_OPAQUE_MODE is "yes" (the default). See Section 9.5 [Plotter Parameters],
page 136.
int pencolorname (const char *name);
pencolorname sets the pen color of all objects subsequently drawn on the graph-
ics display to be name. Unrecognized colors are interpreted as "black". For
information on what color names are recognized, see Appendix B [Color Names],
page 166. A 24-bit RGB color may also be specified as a six-digit hexadecimal
string, e.g., "#c0c0c0".
HP-GL Plotters support drawing with a white pen only if the value of the
parameter HPGL_VERSION is "2" (the default) and the value of the parameter
HPGL_OPAQUE_MODE is "yes" (the default). See Section 9.5 [Plotter Parameters],
page 136.
int pentype (int level);
pentype terminates and draws the path under construction (if any), as if
endpath had been called, and sets the pen level for all subsequently drawn
paths. A value of 1 for level specifies that an outline of each of these objects
should be drawn, in the color previously specified by calling pencolor or
pencolorname. This is the default. A value of 0 specifies that outlines should
not be drawn.
To draw the region bounded by a path in an edgeless way, you would call
pentype to turn off the drawing of the boundary, and filltype to turn on the
filling of the interior.
pentype also affects the drawing of marker symbols and points, i.e., pixels.
A value of 0 specifies that they should not be drawn.
Note: In future releases, pentype may also affect the drawing of text strings
(a value of 0 will specify that they should not be drawn). It already affects
text strings that are rendered using Hershey fonts, since they are drawn using
polygonal paths.
int restorestate ();
restorestate pops the current graphics context off the stack of drawing states.
The graphics context consists largely of libplot’s drawing attributes, which
are set by the attribute functions documented in this section. So popping off
the graphics context restores the drawing attributes to values they previously
had. A path under construction is regarded as part of the graphics context. For
this reason, calling restorestate automatically calls endpath to terminate and
draw the path under construction, if any. All graphics contexts on the stack
are popped off when closepl is called, as if restorestate had been called
repeatedly.
int savestate ();
savestate pushes the current graphics context onto the stack of drawing states.
The graphics context consists largely of libplot’s drawing attributes, which
Chapter 9: libplot, a 2-D Vector Graphics Library 135
are set by the attribute functions documented in this section. A path under
construction, if any, is regarded as part of the graphics context. That is because
paths may be drawn incrementally, one line segment or arc at a time. The new
graphics context created by savestate will contain no path. When the previous
graphics context is returned to by calling restorestate, the path previously
under construction may be continued.
int textangle (int angle);
double ftextangle (double angle);
textangle and ftextangle take one argument, which specifies the angle in
degrees counterclockwise from the x (horizontal) axis in the user coordinate
system, for text strings subsequently drawn on the graphics display. The default
angle is zero. (The font for plotting strings is fully specified by calling fontname,
fontsize, and textangle.) The size of the font for plotting strings, in user
coordinates, is returned.
Warning: Some X Window System displays do not generate or display rotated
fonts correctly. In effect, they only support a zero rotation angle.
If at Plotter creation time a parameter is not specified, its default value will be used,
unless the parameter is string-valued and there is an environment variable of the same
name, in which case the value of that environment variable will be used. This rule increases
run-time flexibility: an application programmer may allow non-critical Plotter parameters
to be specified by the user via environment variables.
In the C++ binding, the PlotterParams class and PlotterParams::setplparam,
a member function, are the analogues of the plPlotterParams datatype and the function
pl_setplparam.
The following are the currently recognized parameters (unrecognized ones are ignored).
The most important ones are DISPLAY, which affects X Plotters, BITMAPSIZE, which af-
fects X Plotters, PNG Plotters, PNM Plotters, and GIF Plotters, PAGESIZE, which affects
Illustrator, Postscript, CGM, Fig, and HP-GL Plotters, and ROTATION, which affects all
Plotters except Metafile Plotters. These four parameters are listed first and the others
alphabetically. Most of the remaining parameters, such as the several whose names begin
with "HPGL", affect only a single type of Plotter.
DISPLAY (Default NULL.) The X Window System display on which the graphics display
will be popped up, as an X window. This is relevant only to X Plotters.
BITMAPSIZE
(Default "570x570".) The size of the graphics display (i.e., the viewport) in
terms of pixels. This is relevant only to X Plotters, PNG Plotters, PNM Plot-
ters, and GIF Plotters. For X Plotters, the value of this parameter will auto-
matically, if it is not set, be taken from the X resource Xplot.geometry. That
is for backward compatibility.
X Plotters support precise positioning of the graphics display. For example, if
BITMAPSIZE is "570x570+0+0" then it will be positioned in the upper left corner
of the X Window System display.
PAGESIZE (Default "letter".) The page type, which determines the size of the graphics
display (i.e., the viewport) used by the Plotter. This is relevant only to SVG,
Illustrator, Postscript, CGM, Fig, PCL, and HP-GL Plotters. "letter" means
an 8.5 in by 11 in page. Any ISO page size in the range "a0". . . "a4" or ANSI
page size in the range "a". . . "e" may be specified ("letter" is an alias for "a"
and "tabloid" is an alias for "b"). "legal", "ledger", and "b5" are recognized
page sizes also.
For Illustrator, Postscript, PCL and Fig Plotters, the graphics display will be,
by default, a square region centered on the specified page. (For example, it
will be a centered 8 in square if PAGESIZE is "letter".) For HP-GL Plotters, it
will be a square region of the same size, but will not by default be centered.
SVG format and WebCGM format have no notion of the Web page on which
the graphics display will ultimately be positioned. They do have a notion of
default display size, though this will normally be overridden when the SVG
or WebCGM file is placed on a Web page. For this default display size, SVG
and CGM Plotters will use the same graphics display size that is used by other
Plotters.
For the default size (and location) of the graphics display for each page type,
see Appendix C [Page and Viewport Sizes], page 167. You do not need to
Chapter 9: libplot, a 2-D Vector Graphics Library 138
use the default size, since either or both of its dimensions can be specified
explicitly. For example, PAGESIZE could be specified as "letter,xsize=4in",
or "a4,xsize=10cm,ysize=15cm". The dimensions are allowed to be negative
(a negative dimension results in a reflection).
For Plotters other than SVG and CGM Plotters, the position of the graph-
ics display on the page, relative to its default position, can be adjusted by
specifying an offset vector. For example, PAGESIZE could be specified as "let-
ter,yoffset=1.2in", or "a4,xoffset=−5mm,yoffset=2.0cm". Inches, centimeters,
and millimeters are the supported units. The "xoffset" and "yoffset" options
may be used in conjunction with "xsize" and "ysize".
It is also possible to position the graphics display precisely, by specifying the
location of its lower left corner relative to the lower left corner of the page. For
example, PAGESIZE could be specified as "letter,xorigin=2in,yorigin=3in", or
"a4,xorigin=0.5cm,yorigin=0.5cm". The "xorigin" and "yorigin" options may
be used in conjunction with "xsize" and "ysize". SVG and WebCGM Plotters
ignore the "xoffset", "yoffset", "xorigin", and "yorigin" options, since SVG
format and WebCGM format have no notion of the Web page on which the
graphics display will ultimately be positioned.
ROTATION (Default "0.0".) Relevant to all Plotters other than Metafile Plotters, which
have no output device. The angle, in degrees, by which the graphics display
(i.e., the viewport) should be rotated, relative to its default orientation. The
rotation is counterclockwise.
A rotated viewport does not change the position of its four corners. Rather,
the graphics are rotated within it. If the viewport is rectangular rather than
square, this ‘rotation’ necessarily includes a rescaling.
This parameter is useful for switching between portrait and landscape orienta-
tions. Internally, it determines the affine transformation from NDC (normalized
device coordinate) space to device space.
BG_COLOR (Default "white".) The initial background color of the graphics display, when
drawing each page of graphics. This is relevant to X Plotters, PNG Plotters,
PNM Plotters, GIF Plotters, CGM Plotters, ReGIS Plotters, and Metafile Plot-
ters; also to X Drawable Plotters (for the last, the background color shows up
only if erase is invoked). For information on what color names are recog-
nized, see Appendix B [Color Names], page 166. The background color may
be changed at any later time by invoking the bgcolor (or bgcolorname) and
erase operations.
SVG Plotters and CGM Plotters support "none" as a value for the background
color. It will turn off the background: the drawn objects will not be backed
by anything. This is useful when the generated SVG or WebCGM file is to be
placed on a Web page.
CGM_ENCODING
(Default "binary".) Relevant only to CGM Plotters. "binary" means that the
CGM output should use the binary encoding. "clear text" means that the CGM
output should use a human-readable encoding. The WebCGM profile requires
that the binary encoding be used, but many CGM viewers and interpreters
Chapter 9: libplot, a 2-D Vector Graphics Library 139
can also parse the clear text encoding. The third standard CGM encoding,
"character", is not currently supported.
CGM_MAX_VERSION
(Default "4".) Relevant only to CGM Plotters. An upper bound on the ver-
sion number of CGM format that is produced. Many older CGM interpreters
and viewers, such as the ones built into Microsoft Office and other commer-
cial software, only support version 1 CGM files. For fully adequate handling of
fonts and line styles, version 3 is necessary. By default, the present release of
libplot produces version 3 CGM files, i.e., it does not use version 4 features.
EMULATE_COLOR
(Default "no".) Relevant to all Plotters. "yes" means that each color in the
output should be replaced by an appropriate shade of gray. The well known
formula for CIE luminance, namely 0.212671R + 0.715160G + 0.072169B, is
used.
This parameter is seldom useful, except when using a PCL Plotter to prepare
output for a monochrome PCL 5 device. Many monochrome PCL 5 devices,
such as monochrome LaserJets, do a poor job of emulating color on their own.
They usually map HP-GL/2’s seven standard pen colors, including even yellow,
to black.
GIF_ANIMATION
(Default "yes".) Relevant only to GIF Plotters. "yes" means that the erase
operation will have special semantics: with the exception of its first invocation,
it will act as a separator between successive images in the written-out pseudo-
GIF file. "no" means that erase should act as it does on other Plotters that do
not write graphics in real time, i.e., it should erase the image under construction
by filling it with the background color. If "no" is specified, the pseudo-GIF file
will contain only a single image.
GIF_DELAY
(Default "0".) Relevant only to GIF Plotters. The delay, in hundredths of a
second, after each image in a written-out animated pseudo-GIF file. The value
should be an integer in the range "0". . . "65535".
GIF_ITERATIONS
(Default "0".) Relevant only to GIF Plotters. The number of times that an
animated pseudo-GIF file should be ‘looped’. The value should be an integer
in the range "0". . . "65535".
HPGL_ASSIGN_COLORS
(Default "no".) Relevant only to HP-GL Plotters, and only if the value of
HPGL_VERSION is "2". "no" means to draw with a fixed set of pens, specified
by setting the HPGL_PENS parameter. "yes" means that pen colors will not re-
stricted to the palette specified in HPGL_PENS: colors will be assigned to “logical
pens” in the range #1. . . #31, as needed. Other than color LaserJet printers
and DesignJet plotters, not many HP-GL/2 devices allow the assignment of
colors to logical pens. In particular, HP-GL/2 pen plotters do not. So this
parameter should be used with caution.
Chapter 9: libplot, a 2-D Vector Graphics Library 140
HPGL_OPAQUE_MODE
(Default "yes".) Relevant only to HP-GL Plotters, and only if the value of
HPGL_VERSION is "2". "yes" means that the HP-GL/2 output device should
be switched into opaque mode, rather than transparent mode. This allows
objects to be filled with opaque white and other opaque colors. It also allows
the drawing of visible white lines, which by convention are drawn with pen #0.
Not all HP-GL/2 devices support opaque mode or the use of pen #0 to draw
visible white lines. In particular, HP-GL/2 pen plotters do not. Some older
HP-GL/2 devices reportedly malfunction if asked to switch into opaque mode.
If the output of an HP-GL Plotter is to be sent to such a device, a "no" value
is recommended.
HPGL_PENS
(Default "1=black:2=red:3=green:4=yellow:5=blue:6=magenta:7=cyan" if the
value of HPGL_VERSION is "1.5" or "2" and "1=black" if the value of HPGL_
VERSION is "1". Relevant only to HP-GL Plotters. The set of available pens; the
format should be self-explanatory. The color for any pen in the range #1. . . #31
may be specified. For information on what color names are recognized, see
Appendix B [Color Names], page 166. Pen #1 must always be present, though
it need not be black. Any pen in the range #2. . . #31 may be omitted.
HPGL_ROTATE
(Default "0".) Relevant only to HP-GL Plotters. The angle, in degrees, by
which the graphics display (i.e., the viewport) should be rotated on the page
relative to the default orientation. Recognized values are "0", "90", "180", and
"270"; "no" and "yes" are equivalent to "0" and "90" respectively. "180" and
"270" are supported only if HPGL_VERSION is "2".
The rotation requested by HPGL_ROTATE is different from the sort requested by
the ROTATION parameter. ROTATION rotates the graphics display in place, but
HPGL_ROTATE both rotates the graphics display and moves its lower left corner
toward another corner of the page. Altering the plotting area in such a way is
supported by the HP-GL language.
The HPGL_ROTATE parameter facilitates switching between portrait and land-
scape orientations. For HP-GL devices that is frequently a concern, since some
HP-GL devices (“plotters”) draw with a default landscape orientation, while
others (“printers”) draw with a default portrait orientation. There is no pro-
grammatic way of determining which is which.
HPGL_VERSION
(Default "2".) Relevant only to HP-GL Plotters. "1" means that the output
should be generic HP-GL, "1.5" means that the output should be suitable for
the HP7550A graphics plotter and the HP758x, HP7595A and HP7596A draft-
ing plotters (HP-GL with some HP-GL/2 extensions), and "2" means that the
output should be modern HP-GL/2. If the version is less than "2" then the only
available fonts will be vector fonts, and all paths will be drawn with a default
thickness, so that invoking linewidth, capmod, joinmod, and fmiterlimit will
have no effect. Also, the ‘nonzero winding number rule’ will not be supported
when filling paths, so invoking fillmod will have no effect. Additionally, if the
Chapter 9: libplot, a 2-D Vector Graphics Library 141
version is "1" then the filling of arbitrary paths will not be supported (circles
and rectangles aligned with the coordinate axes may be filled, however).
INTERLACE
(Default "no".) Relevant only to PNG and GIF Plotters. If the value is "yes",
the output file will be interlaced. That means it will be displayed in an inter-
laced (nonlinear) way by many applications.
MAX_LINE_LENGTH
(Default "500".) The maximum number of defining points that a path may
have, before it is flushed to the output device. If this flushing occurs, the path
will be split into two or more sub-paths, though the splitting should not be
noticeable. Splitting will not be performed if the path is to be filled.
This parameter is relevant to all Plotters except Tektronix and Metafile Plot-
ters. The reason for splitting long paths is that some display devices (e.g., old
Postscript printers and HP-GL pen plotters) have limited buffer sizes. It is not
relevant to Tektronix or Metafile Plotters, since they draw paths in real time
and have no buffer limitations.
META_PORTABLE
(Default "no".) Relevant only to Metafile Plotters. "yes" means that the output
metafile should use a portable (human-readable) encoding of graphics, rather
than the default (binary) encoding. See Appendix D [Metafiles], page 169.
PCL_ASSIGN_COLORS
(Default "no".) Relevant only to PCL Plotters. "no" means to draw with a
fixed set of pens. "yes" means that pen colors will not restricted to this palette:
colors will be assigned to “logical pens”, as needed. Other than color LaserJet
printers, not many PCL 5 devices allow the assignment of colors to logical pens.
So this parameter should be used with caution.
PCL_BEZIERS
(Default "yes".) Relevant only to PCL Plotters. "yes" means that when draw-
ing Bezier curves, the special ‘Bezier instructions’ will be used. "no" means
that these instructions will not be used. Instead, each Bezier curve will be
approximated and drawn as a polygonal line. Other than the LaserJet III,
which was Hewlett–Packard’s first PCL 5 printer, all Hewlett–Packard’s PCL 5
printers support the Bezier instructions.
PNM_PORTABLE
(Default "no".) Relevant only to PNM Plotters. "yes" means that the output
should be in a portable (human-readable) version of PBM/PGM/PPM format,
rather than the default (binary) version. ‘Portable’ is something of a misnomer,
since binary PBM/PGM/PPM files are also portable, in the sense that they are
machine-independent.
TERM (Default NULL.) Relevant only to Tektronix Plotters. If the value is a string
beginning with "xterm", "nxterm", or "kterm", it is taken as a sign that the
current application is running in an X Window System VT100 terminal emula-
tor: an xterm, nxterm, or kterm. Before drawing graphics, a Tektronix Plotter
Chapter 9: libplot, a 2-D Vector Graphics Library 142
will emit an escape sequence that causes the terminal emulator’s auxiliary Tek-
tronix window, which is normally hidden, to pop up. After the graphics are
drawn, an escape sequence that returns control to the original VT100 window
will be emitted. The Tektronix window will remain on the screen.
If the value is a string beginning with "kermit", "ansi.sys", or "nansi.sys", it is
taken as a sign that the current application is running in the VT100 terminal
emulator provided by the MS-DOS version of kermit. Before drawing graph-
ics, a Tektronix Plotter will emit an escape sequence that switches the terminal
emulator to Tektronix mode. Also, some of the Tektronix control codes emit-
ted by the Plotter will be kermit-specific. There will be a limited amount of
color support, which is not normally the case (the 16 ansi.sys colors will be
supported). The "dotdotdashed" line style will be supported, which is also
not normally the case. After drawing graphics, the Plotter will emit an es-
cape sequence that returns the emulator to VT100 mode. The key sequence
‘ALT minus’ may be employed manually within kermit to switch between the
two modes.
TRANSPARENT_COLOR
(Default "none".) Relevant only to PNG and GIF Plotters. If the value is
a recognized color name, that color, if it appears in the output file, will be
treated as transparent by most applications. For information on what names
are recognized, see Appendix B [Color Names], page 166.
If TRANSPARENT_COLOR is set and an animated pseudo-GIF file is produced, the
‘restore to background’ disposal method will be used for each image in the file.
Otherwise, the ‘unspecified’ disposal method will be used.
USE_DOUBLE_BUFFERING
(Default "no".) Relevant only to X Plotters and X Drawable Plotters. If the
value is "yes", a double buffering scheme will be used when drawing graphics.
Each frame of graphics, within a openpl. . . closepl pair, will be written to an
off-screen buffer rather than to the Plotter’s display. When erase is invoked to
end a frame, or when closepl is invoked, the contents of the off-screen buffer
will be copied to the Plotter’s display, pixel by pixel. If successive frames differ
only slightly, this will create the illusion of smooth animation.
Some X displays provide special hardware support for double buffering. If this
support is available, the X Plotter will detect its presence, and will draw graph-
ics using the appropriate extension to the X11 protocol (either DBE or MBX).
In this case the animation will be significantly faster; on high-end graphics
hardware, at least.
VANISH_ON_DELETE
(Default "no".) Relevant only to X Plotters. If the value is "yes", when a
Plotter is deleted, the window or windows that it has popped up will vanish.
Otherwise, each such window will remain on the screen until it is removed by
the user (by typing ‘q’ in it, or by clicking with a mouse).
XDRAWABLE_COLORMAP
(Default NULL.) Relevant only to X Drawable Plotters. If the value is non-
NULL, it should be a Colormap *, a pointer to a colormap from which colors
Chapter 9: libplot, a 2-D Vector Graphics Library 143
7. HersheyEUC
• HersheySans
1. HersheySans
2. HersheySans-Oblique
3. HersheySans-Bold
4. HersheySans-BoldOblique
• HersheyScript
1. HersheyScript
2. HersheyScript
3. HersheyScript-Bold
4. HersheyScript-Bold
• HersheyGothicEnglish
• HersheyGothicGerman
• HersheyGothicItalian
• HersheySerifSymbol
1. HersheySerifSymbol
2. HersheySerifSymbol-Oblique
3. HersheySerifSymbol-Bold
4. HersheySerifSymbol-BoldOblique
• HersheySansSymbol
1. HersheySansSymbol
2. HersheySansSymbol-Oblique
Nearly all Hershey fonts except the Symbol fonts use the ISO-Latin-1 encoding, which is a
superset of ASCII. The Symbol fonts consist of Greek characters and mathematical sym-
bols, and use the symbol font encoding documented in the Postscript Language Reference
Manual. By convention, each Hershey typeface contains a symbol font (HersheySerifSymbol
or HersheySansSymbol, as appropriate) as font #0.
HersheyCyrillic, HersheyCyrillic-Oblique, and HersheyEUC (which is a Japanese font)
are the only non-Symbol Hershey fonts that do not use the ISO-Latin-1 encoding. For their
encodings, see Section A.2 [Cyrillic and Japanese], page 149.
The 35 Postscript fonts are divided into typefaces as follows.
• Helvetica
1. Helvetica
2. Helvetica-Oblique
3. Helvetica-Bold
4. Helvetica-BoldOblique
• Helvetica-Narrow
1. Helvetica-Narrow
2. Helvetica-Narrow-Oblique
Appendix A: Fonts, Strings, and Symbols 146
3. Helvetica-Narrow-Bold
4. Helvetica-Narrow-BoldOblique
• Times
1. Times-Roman
2. Times-Italic
3. Times-Bold
4. Times-BoldItalic
• AvantGarde
1. AvantGarde-Book
2. AvantGarde-BookOblique
3. AvantGarde-Demi
4. AvantGarde-DemiOblique
• Bookman
1. Bookman-Light
2. Bookman-LightItalic
3. Bookman-Demi
4. Bookman-DemiItalic
• Courier
1. Courier
2. Courier-Oblique
3. Courier-Bold
4. Courier-BoldOblique
• NewCenturySchlbk
1. NewCenturySchlbk-Roman
2. NewCenturySchlbk-Italic
3. NewCenturySchlbk-Bold
4. NewCenturySchlbk-BoldItalic
• Palatino
1. Palatino-Roman
2. Palatino-Italic
3. Palatino-Bold
4. Palatino-BoldItalic
• ZapfChancery-MediumItalic
• ZapfDingbats
• Symbol
All Postscript fonts except the ZapfDingbats and Symbol fonts use the ISO-Latin-1 encod-
ing. The encodings used by the ZapfDingbats and Symbol fonts are documented in the
Postscript Language Reference Manual. By convention, each Postscript typeface contains
the Symbol font as font #0.
The 45 PCL 5 fonts are divided into typefaces as follows.
Appendix A: Fonts, Strings, and Symbols 147
• Univers
1. Univers
2. Univers-Oblique
3. Univers-Bold
4. Univers-BoldOblique
• UniversCondensed
1. UniversCondensed
2. UniversCondensed-Oblique
3. UniversCondensed-Bold
4. UniversCondensed-BoldOblique
• CGTimes
1. CGTimes-Roman
2. CGTimes-Italic
3. CGTimes-Bold
4. CGTimes-BoldItalic
• Albertus
1. AlbertusMedium
2. AlbertusMedium
3. AlbertusExtraBold
4. AlbertusExtraBold
• AntiqueOlive
1. AntiqueOlive
2. AntiqueOlive-Italic
3. AntiqueOlive-Bold
• Arial
1. Arial-Roman
2. Arial-Italic
3. Arial-Bold
4. Arial-BoldItalic
• ClarendonCondensed
• Coronet
• Courier
1. Courier
2. Courier-Italic
3. Courier-Bold
4. Courier-BoldItalic
• Garamond
1. Garamond
2. Garamond-Italic
Appendix A: Fonts, Strings, and Symbols 148
3. Garamond-Bold
4. Garamond-BoldItalic
• LetterGothic
1. LetterGothic-Roman
2. LetterGothic-Italic
3. LetterGothic-Bold
4. LetterGothic-BoldItalic
• Marigold
• CGOmega
1. CGOmega-Roman
2. CGOmega-Italic
3. CGOmega-Bold
4. CGOmega-BoldItalic
• TimesNewRoman
1. TimesNewRoman
2. TimesNewRoman-Italic
3. TimesNewRoman-Bold
4. TimesNewRoman-BoldItalic
• Wingdings
• Symbol
All PCL 5 fonts except the Wingdings and Symbol fonts use the ISO-Latin-1 encoding. The
encoding used by the Symbol font is the symbol font encoding documented in the Postscript
Language Reference Manual. By convention, each PCL typeface contains the Symbol font
as font #0.
The 18 Hewlett–Packard vector fonts are divided into typefaces as follows.
• Arc
1. Arc
2. Arc-Oblique
3. Arc-Bold
4. Arc-BoldOblique
• Stick
1. Stick
2. Stick-Oblique
3. Stick-Bold
4. Stick-BoldOblique
• ArcANK
1. ArcANK*
2. ArcANK-Oblique*
3. ArcANK-Bold*
Appendix A: Fonts, Strings, and Symbols 149
4. ArcANK-BoldOblique*
• StickANK
1. StickANK*
2. StickANK-Oblique*
3. StickANK-Bold*
4. StickANK-BoldOblique*
• ArcSymbol*
• StickSymbol*
The Hewlett–Packard vector fonts with an asterisk (the ANK and Symbol fonts) are only
available when producing HP-GL/2 graphics, or HP-GL graphics for the HP7550A graphics
plotter and the HP758x, HP7595A and HP7596A drafting plotters. That is, they are
available only if HPGL_VERSION is "2" (the default) or "1.5". The ANK fonts are Japanese
fonts (see Section A.2 [Cyrillic and Japanese], page 149), and the Symbol fonts contain a
few miscellaneous mathematical symbols.
All Hewlett–Packard vector fonts except the ANK and Symbol fonts use the ISO-Latin-1
encoding. The Arc fonts are proportional (variable-width) fonts, and the Stick fonts are
fixed-width fonts. If HP-GL/2 or HP-GL output is selected, the Arc fonts are assumed
to be kerned via device-resident kerning tables. But when producing PCL 5 output, it is
assumed that the display device will do no kerning. Apparently Hewlett–Packard dropped
support for device-resident kerning tables when emulating HP-GL/2 from within PCL 5.
For information about Hewlett–Packard vector fonts and the way in which they are kerned
(in HP-GL pen plotters, at least), see the article by L. W. Hennessee et al. in the Nov. 1981
issue of the Hewlett–Packard Journal.
To what extent do the fonts supported by libplot contain ligatures? The Postscript
fonts, the PCL 5 fonts, and the Hewlett–Packard vector fonts, at least as implemented in
libplot, do not contain ligatures. However, six of the 22 Hershey fonts contain ligatures.
The character combinations "fi", "ff", "fl", "ffi", and "ffl" are automatically drawn as lig-
atures in HersheySerif and HersheySerif-Italic. (Also in the two HersheyCyrillic fonts and
HersheyEUC, since insofar as printable ASCII characters are concerned, they are identical
[or almost identical] to HersheySerif.) In addition, "tz" and "ch" are ligatures in Hershey-
GothicGerman. The German double-s character ‘ß’, which is called an ‘eszet’, is not treated
as a ligature in any font. To obtain an eszet, you must either request one with the escape
sequence "\ss" (see Section A.4 [Text String Format], page 151), or, if you have an 8-bit
keyboard, type an eszet explicitly.
contains lower-case Cyrillic characters and the byte range 0xe0. . . 0xff contains upper case
Cyrillic characters. Additional Cyrillic characters are located at 0xa3 and 0xb3. For more
on the encoding scheme, see the official KOI8-R Web page and Internet RFC 1489, which
is available in many places, including Information Sciences Institute.
The HersheyEUC font is a vector font that is used for displaying Japanese text. It uses
the 8-bit EUC-JP encoding. EUC stands for ‘extended Unix code’, which is a scheme for
encoding Japanese, and also other character sets (e.g., Greek and Cyrillic) as multibyte
character strings. The format of EUC strings is explained in Ken Lunde’s Understanding
Japanese Information Processing (O’Reilly, 1993), which contains much additional infor-
mation on Japanese text processing. See also his on-line supplement, and his more recent
book CJKV Information Processing (O’Reilly, 1999).
In the HersheyEUC font, characters in the printable ASCII range, 0x20. . . 0x7e, are
similar to HersheySerif (their encoding is ‘JIS Roman’, an ASCII variant standardized by
the Japanese Industrial Standards Committee). Also, each successive pair of bytes in the
0xa1. . . 0xfe range defines a single character in the JIS X0208 standard. The characters
in the JIS X0208 standard include Japanese syllabic characters (Hiragana and Katakana),
ideographic characters (Kanji), Roman, Greek, and Cyrillic alphabets, punctuation marks,
and miscellaneous symbols. For example, the JIS X0208 standard indexes the 83 Hiragana
as 0x2421. . . 0x2473. To obtain the EUC code for any JIS X0208 character, you would add
0x80 to each byte (i.e., ‘set the high bit’ on each byte). So the first of the 83 Hiragana
(0x2421) would be encoded as the successive pair of bytes 0xa4 and 0xa1.
The implementation of the JIS X0208 standard in the HersheyEUC font is based on
Dr. Hershey’s digitizations, and is complete enough to be useful. All 83 Hiragana and 86
Katakana are available, though the little-used ‘half-width Katakana’ are not supported.
Also, 603 Kanji are available, including 596 of the 2965 JIS Level 1 (i.e., frequently used)
Kanji. The Hiragana, the Katakana, and the available Kanji all have the same width.
The file ‘kanji.doc’, which on most systems is installed in ‘/usr/share/libplot’ or
‘/usr/local/share/libplot’, lists the 603 available Kanji. Each JIS X0208 character
that is unavailable will be drawn as an ‘undefined character’ glyph (a bundle of horizontal
lines).
The eight Hewlett–Packard vector fonts in the ArcANK and StickANK typefaces are also
used for displaying Japanese text. They are available when producing HP-GL/2 output, or
HP-GL output for the HP7550A graphics plotter and the HP758x, HP7595A and HP7596A
drafting plotters. That is, they are available only if HPGL_VERSION is "2" (the default)
or "1.5".
ANK stands for Alphabet, Numerals, and Katakana. The ANK fonts use a special mixed
encoding. The lower half of each font uses the JIS Roman encoding, and the upper half
contains half-width Katakana. Half-width Katakana are simplified Katakana that may need
to be equipped with diacritical marks. The diacritical marks are included in the encoding
as separate characters.
vector fonts. They can use the 35 built-in Postscript fonts too, if those fonts are available
on the X display. Most releases of the plotting utilities include freely distributable versions
of the 35 Postscript fonts, in Type 1 format, that are easily installed on any X display.
The plotting utilities can in fact use most of the ‘core’ fonts that are available on the
X display. This includes scalable fonts that have so-called XLFD (X Logical Font Descrip-
tion) names. You may determine which such fonts are available by using the low-level
xlsfonts command. Fonts whose names end in "-0-0-0-0-p-0-iso8859-1" or "-0-0-0-0-m-
0-iso8859-1" are scalable ISO-Latin-1 fonts that can be used by libplot and the plotting
utilities. For example, the "CharterBT-Roman" font is available on many X displays. Its
full XLFD name is "-bitstream-charter-medium-r-normal–0-0-0-0-p-0-iso8859-1". The plot-
ting utilities would refer to it by its base XLFD name, which has only three hyphens;
namely, "charter-medium-r-normal". The command
echo 0 0 1 1 2 0 | graph -T X -F charter-medium-r-normal
will draw a plot in a popped-up X window, in which the axis ticks are labeled in this font.
Fonts whose names end in "iso8859-2", etc., and "adobe-fontspecific", may also be used,
though they do not employ the standard ISO-Latin-1 encoding. By default libplot will
try to retrieve an "iso8859-1", i.e., ISO-Latin-1 version of the font, if one is available. But
you can work around this by giving the full name of the font, if you wish. Supplying the full
name of an X font is also useful if you wish to employ a screen font (i.e., bitmap font), such
as the traditional fonts "fixed" and "9x15". If you supply the full name of an X font, rather
than a base XLFD name, each character glyph, once it is obtained from the X display as a
pattern of pixels, will be scaled by libplot to the appropriate size.
The plotting utilities, including graph, support a ‘--bitmap-size’ option. If the ‘-T X’
option is used, it sets the size of the popped-up X Window. You may use it to obtain
some interesting visual effects. Each of the plotting utilities assumes that it is drawing
in a square region, so if you use the ‘--bitmap-size 800x400’ option, your plot will be
scaled anisotropically, by a larger factor in the horizontal direction than in the vertical
direction. The X fonts in the plot will be scaled accordingly. In the same spirit, the
‘--rotation’ option will rotate the plot, causing all text strings to be rotated too. For
example, ‘--rotation 45’ will induce a 45-degree counterclockwise rotation. The options
‘--bitmap-size’ and ‘--rotation’ may be applied together.
The escape sequences that provide access to the non-ASCII ‘8-bit’ characters in the built-
in ISO-Latin-1 fonts may be employed when using any ISO-Latin-1 X Window System font.
For more on escape sequences, see Section A.4 [Text String Format], page 151. As an
example, "\Po" will yield the British pounds sterling symbol ‘£’. The command
echo 0 0 1 1 | graph -T X -F times-medium-r-normal -L "A \Po1 Plot"
shows how this symbol could be used in a graph label. In the same way, the escape sequences
that provide access to mathematical symbols and Greek characters may be employed when
using any X Window System font, whether or not it is an ISO-Latin-1 font. These symbols
and characters are taken from the Symbol font, which is available on nearly all X displays.
acters. No embedded control characters, such as newlines or carriage returns, are al-
lowed. Technically, a character is ‘printable’ if it comes from either of the two byte ranges
0x20. . . 0x7e and 0xa0. . . 0xff. The former is the printable ASCII range and the latter is
the printable ‘8-bit’ range.
Text strings may, however, include embedded ‘escape sequences’ that shift the font,
append subscripts or superscripts, or include non-ASCII characters and mathematical sym-
bols. As a consequence, the axis labels on a plot prepared with graph may include such
features. So may the text strings that pic2plot uses to label objects.
The format of the escape sequences should look familiar to anyone who is familiar with
the TEX, troff, or groff document formatters. Each escape sequence consists of three
characters: a backslash and two additional characters. The most frequently used escape
sequences are as follows.
"\sp" start superscript mode
"\ep" end superscript mode
"\sb" start subscript mode
"\eb" end subscript mode
"\mk" mark position
"\rt" return to marked position
For example, the string "x\sp2\ep" would be interpreted as ‘x squared’. Subscripts on sub-
scripts, etc., are allowed. Subscripts and superscripts may be vertically aligned by judicious
use of the "\mk" and "\rt" escape sequences. For example, "a\mk\sbi\eb\rt\sp2\ep"
produces "a sub i squared", with the exponent ‘2’ placed immediately above the subscript.
There are also escape sequences that switch from font to font within a typeface. For
an enumeration of the fonts within each typeface, see Section A.1 [Text Fonts], page 144.
Suppose for example that the current font is Times-Roman, which is font #1 in the ‘Times’
typeface. The string "A \f2very\f1 well labeled axis" would be a string in which the word
‘very’ appears in Times-Italic rather than Times-Roman. That is because Times-Italic is
the #2 font in the typeface. Font-switching escape sequences are of the form "\fn", where
n is the number of the font to be switched to. For compatibility with troff and groff,
"\fR", "\fI", "\fB" are equivalent to "\f1", "\f2", "\f3", respectively. "\fP" will switch
the font to the previously used font (only one font is remembered). There is currently no
support for switching between fonts in different typefaces.
There are also a few escape sequences for horizontal shifts, which are useful for improving
horizontal alignment, such as when shifting between italic and non-italic fonts. "\r1", "\r2",
"\r4", "\r6", "\r8", and "\r^" are escape sequences that shift right by 1 em, 1/2 em, 1/4
em, 1/6 em, 1/8 em, and 1/12 em, respectively. "\l1", "\l2", "\l4", "\l6", "\l8", and "\l^"
are similar, but shift left instead of right. "A \fIvery\r^\fP well labeled axis" would look
slightly better than "A \fIvery\fP well labeled axis".
Square roots are handled with the aid of a special pair of escape sequences, together
with the "\mk" and "\rt" sequences discussed above. A square root symbol is begun with
"\sr", and continued arbitrarily far to the right with the overbar (‘run’) escape sequence,
"\rn". For example, the string "\sr\mk\rn\rn\rtab" would be plotted as ‘the square root
Appendix A: Fonts, Strings, and Symbols 153
of ab’. To adjust the length of the overbar, you may need to experiment with the number
of times "\rn" appears.
To underline a string, you would use "\ul", the underline escape sequence, one or more
times. The "\mk". . . "\rt" trick would be employed in the same way. So, for example,
"\mk\ul\ul\ul\rtabc" would yield an underlined "abc". To adjust the length of the un-
derline, you may need to experiment with the number of times "\ul" appears. You may
also need to use one or more of the abovementioned horizontal shifts. For example, if the
"HersheySerif" font were used, "\mk\ul\ul\l8\ul\rtabc" would yield a better underline
than "\mk\ul\ul\ul\rtabc".
Besides the preceding escape sequences, there are also escape sequences for the print-
able non-ASCII characters in each of the built-in ISO-Latin-1 fonts (which means in every
built-in font, except for the symbol fonts, the HersheyCyrillic fonts, HersheyEUC, and
ZapfDingbats). The useful non-ASCII characters include accented characters among oth-
ers. Such ‘8-bit’ characters, in the 0xa0. . . 0xff byte range, may be included directly in a
text string. But if your terminal does not permit this, you may use the escape sequences
for them instead.
There are escape sequences for the mathematical symbols and Greek characters in the
symbol fonts, as well. This is how the symbol fonts are usually accessed. Which symbol font
the mathematical symbols and Greek characters are taken from depends on whether your
current font is a Hershey font or a non-Hershey font. They are taken from the Hershey-
SerifSymbol font or the HersheySansSymbol font in the former case, and from the Symbol
font in the latter.
The following are the escape sequences that provide access to the non-ASCII characters
of the current font, provided that it is an ISO-Latin-1 font. Each escape sequence is followed
by the position of the corresponding character in the ISO-Latin-1 encoding (in decimal),
and the official Postscript name of the character. Most names should be self-explanatory.
For example, ‘eacute’ is a lower-case ‘e’, equipped with an acute accent.
"\r!" [161] exclamdown
"\ct" [162] cent
"\Po" [163] sterling
"\Cs" [164] currency
"\Ye" [165] yen
"\bb" [166] brokenbar
"\sc" [167] section
"\ad" [168] dieresis
"\co" [169] copyright
"\Of" [170] ordfeminine
"\Fo" [171] guillemotleft
"\no" [172] logicalnot
"\hy" [173] hyphen
Appendix A: Fonts, Strings, and Symbols 154
"\SO" sun
"\ME" mercury
"\VE" venus
"\EA" earth
"\MA" mars
"\JU" jupiter
"\SA" saturn
"\UR" uranus
"\NE" neptune
"\PL" pluto
"\LU" moon
"\CT" comet
"\ST" star
"\AS" ascendingnode
"\DE" descendingnode
"\AR" aries
"\TA" taurus
"\GE" gemini
"\CA" cancer
"\LE" leo
"\VI" virgo
"\LI" libra
"\SC" scorpio
"\SG" sagittarius
"\CP" capricornus
"\AQ" aquarius
"\PI" pisces
The preceding miscellaneous and astronomical symbols are not the only special non-
font symbols that can be used if the current font is a Hershey font. The entire library
of glyphs digitized by Allen Hershey is built into GNU libplot. So text strings may in-
clude any Hershey glyph. Each of the available Hershey glyphs is identified by a four-digit
number. Standard Hershey glyph #1 would be specified as "\#H0001". The standard
Hershey glyphs range from "\#H0001" to "\#H3999", with a number of gaps. Some addi-
tional glyphs designed by others appear in the "\#H4000". . . "\#H4194" range. Syllabic
Japanese characters (Kana) are located in the "\#H4195". . . "\#H4399" range.
Appendix A: Fonts, Strings, and Symbols 163
You may order a table of nearly all the Hershey glyphs in the "\#H0001". . . "\#H3999"
range from the U.S. National Technical Information Service, at +1 703 487 4650. Ask for
item number PB251845; the current price is about US$40. By way of example, the string
"\#H0744\#H0745\#H0001\#H0002\#H0003\#H0869\#H0907\#H2330\#H2331"
when drawn will display a shamrock, a fleur-de-lys, cartographic (small) letters A, B, C,
a bell, a large circle, a treble clef, and a bass clef. Again, this assumes that the current font
is a Hershey font.
You may also use Japanese syllabic characters (Hiragana and Katakana) and ideographic
characters (Kanji) when drawing strings in any Hershey font. In all, 603 Kanji are avail-
able; these are the same Kanji that are available in the HersheyEUC font. The Japanese
characters are indexed according to the JIS X0208 standard for Japanese typography, which
represents each character by a two-byte sequence. The file ‘kanji.doc’, which is distributed
along with the GNU plotting utilities, lists the available Kanji. On most systems it is in-
stalled in ‘/usr/share/libplot’ or ‘/usr/local/share/libplot’.
Each JIS X0208 character would be specified by an escape sequence which expresses
this two-byte sequence as four hexadecimal digits, such as "\#J357e". Both bytes must
be in the 0x21. . . 0x7e range in order to define a JIS X0208 character. Kanji are lo-
cated at "\#J3021" and above. Characters appearing elsewhere in the JIS X0208 encod-
ing may be accessed similarly. For example, Hiragana and Katakana are located in the
"\#J2421". . . "\#J257e" range, and Roman characters in the "\#J2321". . . "\#J237e"
range. The file ‘kana.doc’, which is installed in the same directory as ‘kanji.doc’, lists the
encodings of the Hiragana and Katakana. For more on the JIS X0208 standard, see Ken
Lunde’s Understanding Japanese Information Processing (O’Reilly, 1993), and his on-line
supplement.
The Kanji numbering used in A. N. Nelson’s Modern Reader’s Japanese-English Char-
acter Dictionary, a longtime standard, is also supported. (This dictionary is published by
C. E. Tuttle and Co., with ISBN 0-8048-0408-7. A revised edition [ISBN 0-8048-2036-8]
appeared in 1997, but uses a different numbering.) ‘Nelson’ escape sequences for Kanji are
similar to JIS X0208 escape sequences, but use four decimal instead of four hexadecimal
digits. The file ‘kanji.doc’ gives the correspondence between the JIS numbering scheme
and the Nelson numbering scheme. For example, "\#N0001" is equivalent to "\#J306c".
It also gives the positions of the available Kanji in the Unicode encoding.
All available Kanji have the same width, which is the same as that of the syllabic
Japanese characters (Hiragana and Katakana). Each Kanji that is not available will print
as an ‘undefined character’ glyph (a bundle of horizontal lines). The same is true for non-
Kanji JIS X0208 characters that are not available.
graph -T hpgl and graph -T tek. Those variants of graph normally have no access to
ZapfDingbats and other Postscript fonts, so they use the HersheySerif font instead.
Many of the characters in the ZapfDingbats font are suitable for use as marker symbols.
For example, character #74 is the Texas star. Doing
echo 0 0 1 2 2 1 3 2 4 0 | graph -T ps -m 0 -S 74 0.1 > plot.ps
will produce a Postscript plot consisting of five data points, not joined by line segments.
Each data point will be marked by a Texas star, of a large font size (0.1 times the width of
the plotting box).
If you are using graph -T pcl or graph -T hpgl and wish to use font characters as
marker symbols, you should consider using the Wingdings font, which is available when
producing PCL 5 or HP-GL/2 output. Doing
echo 0 0 1 2 2 1 3 2 4 0 |
graph -T pcl -m 0 --symbol-font Wingdings -S 181 0.1 > plot.pcl
will produce a PCL 5 plot that is similar to the preceding Postscript plot. The Wingdings
font has the Texas star in location #181.
Appendix B: Specifying Colors by Name 166
‘n’ cont
‘p’ point
‘s’ space
‘t’ label
The full set of 85 op codes is listed in the libplot header file ‘plot.h’ and the libplotter
header file ‘plotter.h’, which are distributed along with the plotting utilities. On most
systems they are installed in ‘/usr/include’ or ‘/usr/local/include’.
The 10 op codes in the table above are actually the op codes of the traditional ‘plot(5)’
format produced by pre-GNU versions of graph and libplot. The use of these op codes
make GNU metafile format compatible with plot(5) format. The absence of a magic string,
and the absence of the ‘o’ and ‘x’ op codes, makes it possible to distinguish files in plot(5)
format from GNU metafiles in the binary encoding. GNU plot can convert files in plot(5)
format to GNU metafiles in either the binary or the portable encoding. See Chapter 3
[plot], page 30.
Appendix E: Obtaining Auxiliary Software 171
Thomas Wolff for Ghostscript. The interpolation algorithms used in spline are based
on the algorithms of Alan K. Cline, as described in his papers in the Apr. 1974 issue of
Communications of the ACM . The table-driven parser used in tek2plot was written at
Berkeley in the mid-1980’s by Edward Moy. The ‘sagitta’ algorithm used in an extended
form in libplot for drawing circular and elliptic arcs was developed by Peter Karow of
URW and Ken Turkowski of Apple. Raymond Toy helped with the tick mark spacing
code in graph and was the first to incorporate GNU getopt. Arthur Smith, formerly of
LASSP at Cornell, provided code for his xplot utility. Nelson Beebe exhaustively tested
the package installation process.
Robert Maier wrote the documentation, which now incorporates Nick Tufillaro’s ode
manual. Julie Sussmann checked over the documentation for style and clarity.
Appendix G: Reporting Bugs 174
under this License. If a section does not fit the above definition of Secondary then it is
not allowed to be designated as Invariant. The Document may contain zero Invariant
Sections. If the Document does not identify any Invariant Sections then there are none.
The “Cover Texts” are certain short passages of text that are listed, as Front-Cover
Texts or Back-Cover Texts, in the notice that says that the Document is released under
this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may
be at most 25 words.
A “Transparent” copy of the Document means a machine-readable copy, represented
in a format whose specification is available to the general public, that is suitable for
revising the document straightforwardly with generic text editors or (for images com-
posed of pixels) generic paint programs or (for drawings) some widely available drawing
editor, and that is suitable for input to text formatters or for automatic translation to
a variety of formats suitable for input to text formatters. A copy made in an otherwise
Transparent file format whose markup, or absence of markup, has been arranged to
thwart or discourage subsequent modification by readers is not Transparent. An image
format is not Transparent if used for any substantial amount of text. A copy that is
not “Transparent” is called “Opaque”.
Examples of suitable formats for Transparent copies include plain ascii without
markup, Texinfo input format, LaTEX input format, SGML or XML using a publicly
available DTD, and standard-conforming simple HTML, PostScript or PDF designed
for human modification. Examples of transparent image formats include PNG, XCF
and JPG. Opaque formats include proprietary formats that can be read and edited
only by proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the machine-generated HTML,
PostScript or PDF produced by some word processors for output purposes only.
The “Title Page” means, for a printed book, the title page itself, plus such following
pages as are needed to hold, legibly, the material this License requires to appear in the
title page. For works in formats which do not have any title page as such, “Title Page”
means the text near the most prominent appearance of the work’s title, preceding the
beginning of the body of the text.
A section “Entitled XYZ” means a named subunit of the Document whose title either
is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in
another language. (Here XYZ stands for a specific section name mentioned below, such
as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve
the Title” of such a section when you modify the Document means that it remains a
section “Entitled XYZ” according to this definition.
The Document may include Warranty Disclaimers next to the notice which states that
this License applies to the Document. These Warranty Disclaimers are considered to
be included by reference in this License, but only as regards disclaiming warranties:
any other implication that these Warranty Disclaimers may have is void and has no
effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either commercially or
noncommercially, provided that this License, the copyright notices, and the license
notice saying this License applies to the Document are reproduced in all copies, and
Appendix H: GNU Free Documentation License 177
that you add no other conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further copying of the copies
you make or distribute. However, you may accept compensation in exchange for copies.
If you distribute a large enough number of copies you must also follow the conditions
in section 3.
You may also lend copies, under the same conditions stated above, and you may publicly
display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have printed covers) of
the Document, numbering more than 100, and the Document’s license notice requires
Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all
these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify you as the publisher
of these copies. The front cover must present the full title with all words of the title
equally prominent and visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve the title of the
Document and satisfy these conditions, can be treated as verbatim copying in other
respects.
If the required texts for either cover are too voluminous to fit legibly, you should put
the first ones listed (as many as fit reasonably) on the actual cover, and continue the
rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100,
you must either include a machine-readable Transparent copy along with each Opaque
copy, or state in or with each Opaque copy a computer-network location from which
the general network-using public has access to download using public-standard network
protocols a complete Transparent copy of the Document, free of added material. If
you use the latter option, you must take reasonably prudent steps, when you begin
distribution of Opaque copies in quantity, to ensure that this Transparent copy will
remain thus accessible at the stated location until at least one year after the last time
you distribute an Opaque copy (directly or through your agents or retailers) of that
edition to the public.
It is requested, but not required, that you contact the authors of the Document well
before redistributing any large number of copies, to give them a chance to provide you
with an updated version of the Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document under the conditions
of sections 2 and 3 above, provided that you release the Modified Version under precisely
this License, with the Modified Version filling the role of the Document, thus licensing
distribution and modification of the Modified Version to whoever possesses a copy of
it. In addition, you must do these things in the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title distinct from that of the
Document, and from those of previous versions (which should, if there were any,
be listed in the History section of the Document). You may use the same title as
a previous version if the original publisher of that version gives permission.
Appendix H: GNU Free Documentation License 178
B. List on the Title Page, as authors, one or more persons or entities responsible for
authorship of the modifications in the Modified Version, together with at least five
of the principal authors of the Document (all of its principal authors, if it has fewer
than five), unless they release you from this requirement.
C. State on the Title page the name of the publisher of the Modified Version, as the
publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications adjacent to the other
copyright notices.
F. Include, immediately after the copyright notices, a license notice giving the public
permission to use the Modified Version under the terms of this License, in the form
shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections and required Cover
Texts given in the Document’s license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled “History”, Preserve its Title, and add to it an item
stating at least the title, year, new authors, and publisher of the Modified Version
as given on the Title Page. If there is no section Entitled “History” in the Docu-
ment, create one stating the title, year, authors, and publisher of the Document
as given on its Title Page, then add an item describing the Modified Version as
stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for public access to
a Transparent copy of the Document, and likewise the network locations given in
the Document for previous versions it was based on. These may be placed in the
“History” section. You may omit a network location for a work that was published
at least four years before the Document itself, or if the original publisher of the
version it refers to gives permission.
K. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title
of the section, and preserve in the section all the substance and tone of each of the
contributor acknowledgements and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document, unaltered in their text and
in their titles. Section numbers or the equivalent are not considered part of the
section titles.
M. Delete any section Entitled “Endorsements”. Such a section may not be included
in the Modified Version.
N. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in
title with any Invariant Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or appendices that qualify
as Secondary Sections and contain no material copied from the Document, you may at
your option designate some or all of these sections as invariant. To do this, add their
titles to the list of Invariant Sections in the Modified Version’s license notice. These
titles must be distinct from any other section titles.
Appendix H: GNU Free Documentation License 179
You may add a section Entitled “Endorsements”, provided it contains nothing but
endorsements of your Modified Version by various parties—for example, statements of
peer review or that the text has been approved by an organization as the authoritative
definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up
to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified
Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be
added by (or through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or by arrangement
made by the same entity you are acting on behalf of, you may not add another; but
you may replace the old one, on explicit permission from the previous publisher that
added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission
to use their names for publicity for or to assert or imply endorsement of any Modified
Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under this License,
under the terms defined in section 4 above for modified versions, provided that you
include in the combination all of the Invariant Sections of all of the original documents,
unmodified, and list them all as Invariant Sections of your combined work in its license
notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and multiple identical
Invariant Sections may be replaced with a single copy. If there are multiple Invariant
Sections with the same name but different contents, make the title of each such section
unique by adding at the end of it, in parentheses, the name of the original author or
publisher of that section if known, or else a unique number. Make the same adjustment
to the section titles in the list of Invariant Sections in the license notice of the combined
work.
In the combination, you must combine any sections Entitled “History” in the vari-
ous original documents, forming one section Entitled “History”; likewise combine any
sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You
must delete all sections Entitled “Endorsements.”
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents released
under this License, and replace the individual copies of this License in the various
documents with a single copy that is included in the collection, provided that you
follow the rules of this License for verbatim copying of each of the documents in all
other respects.
You may extract a single document from such a collection, and distribute it individu-
ally under this License, provided you insert a copy of this License into the extracted
document, and follow this License in all other respects regarding verbatim copying of
that document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate and independent
documents or works, in or on a volume of a storage or distribution medium, is called
Appendix H: GNU Free Documentation License 180
an “aggregate” if the copyright resulting from the compilation is not used to limit the
legal rights of the compilation’s users beyond what the individual works permit. When
the Document is included in an aggregate, this License does not apply to the other
works in the aggregate which are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document,
then if the Document is less than one half of the entire aggregate, the Document’s Cover
Texts may be placed on covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form. Otherwise they
must appear on printed covers that bracket the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may distribute translations
of the Document under the terms of section 4. Replacing Invariant Sections with
translations requires special permission from their copyright holders, but you may
include translations of some or all Invariant Sections in addition to the original versions
of these Invariant Sections. You may include a translation of this License, and all the
license notices in the Document, and any Warranty Disclaimers, provided that you
also include the original English version of this License and the original versions of
those notices and disclaimers. In case of a disagreement between the translation and
the original version of this License or a notice or disclaimer, the original version will
prevail.
If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “His-
tory”, the requirement (section 4) to Preserve its Title (section 1) will typically require
changing the actual title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except as expressly
provided for under this License. Any other attempt to copy, modify, sublicense or
distribute the Document is void, and will automatically terminate your rights under
this License. However, parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such parties remain in full
compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of the GNU Free
Documentation License from time to time. Such new versions will be similar in spirit
to the present version, but may differ in detail to address new problems or concerns.
See http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. If the Document
specifies that a particular numbered version of this License “or any later version”
applies to it, you have the option of following the terms and conditions either of that
specified version or of any later version that has been published (not as a draft) by
the Free Software Foundation. If the Document does not specify a version number of
this License, you may choose any version ever published (not as a draft) by the Free
Software Foundation.
Appendix H: GNU Free Documentation License 181
Table of Contents