Page 170 Table of Contents Index Page 172
Chapters
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
A, B, C, D, E



CHAPTER 18. GRAPH FORMATTING

object component used for duplicate comparison; the default is identity. duplicate-test is a
function of two arguments that is used to compare two objects to see if they are duplicates; the
default is eql. duplicate-key and duplicate-test have dynamic extent.

generation-separation is the amount of space to leave between successive generations of the graph;
the default is 20. within-generation-separation is the amount of space to leave between nodes in
the same generation of the graph; the default is 10. generation-separation and within-generation-
separation
are specified in the same way as the inter-row-spacing argument to formatting-
table
.

When center-nodes is true, each node of the graph is centered with respect to the widest node
in the same generation. The default is false.

arc-drawer is a function of seven positional and some unspecified keyword arguments that is
responsible for drawing the arcs from one node to another; it has dynamic extent. The positional
arguments are the stream, the "from" node, the "to" node, the "from" x and y position, and the
"to" x and y position. The keyword arguments gotten from arc-drawing-options are typically
line drawing options, such as for draw-line*. If arc-drawer is unsupplied, the default behavior
is to draw a thin line from the "from" node to the "to" node using draw-line*.

graph-type is a keyword that specifies the type of graph to draw. All CLIM implementations must
support graphs of type :tree, :directed-graph (and its synonym :digraph), and :directed-
acyclic-graph
(and its synonym :dag). graph-type defaults to :digraph when merge-duplicates
is true, otherwise it defaults to :tree. Typically, different graph types will use different output
record classes and layout engines to lay out the graph. However, it is permissible for all of the
required graph types to use exactly the same graph layout engine.

18.2 The Graph Formatting Protocols

Graph formatting is implemented on top of the basic output recording protocol, using with-new-
output-record
to specify the appropriate type of output record. For example, format-graph-
from-roots
first collects all the output that belongs in the graph into a collection of graph node
output records by calling generate-graph-nodes. All of the graph node output records are
descendents of a single graph output record. During this phase, stream-drawing-p is bound
to nil and stream-recording-p is bound to t. When all the output has been generated, the
graph layout code (layout-graph-nodes and layout-graph-edges) is called to compute the
graph layout. Finally, the graph output record is positioned on the stream at the current text
cursor position and then displayed by calling replay on the graph output record.

=> graph-output-record [Protocol Class]
The protocol class that represents a graph; a subclass of output-record. If you want to create a
new class that behaves like a graph output record, it should be a subclass of graph-output-record.
Subclasses of graph-output-record must obey the graph output record protocol.

=> graph-output-record-p object [Function]


Page 170 Table of Contents Index Page 172
Chapters
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
A, B, C, D, E