From 1901157534642a0e5f1c51c22f9c5243c7f2249e Mon Sep 17 00:00:00 2001 From: north Date: Fri, 9 Oct 2009 18:18:07 +0000 Subject: [PATCH] working --- doc/dotguide/ndotguide.tex | 1735 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1735 insertions(+) create mode 100644 doc/dotguide/ndotguide.tex diff --git a/doc/dotguide/ndotguide.tex b/doc/dotguide/ndotguide.tex new file mode 100644 index 000000000..05f0eef40 --- /dev/null +++ b/doc/dotguide/ndotguide.tex @@ -0,0 +1,1735 @@ +\documentclass[11pt]{article} +\usepackage{graphicx} +\usepackage{times} +\pagestyle{myheadings} +\author{Emden Gansner and Eleftherios Koutsofios and Stephen North} +\def\dot{{\it dot}} +\def\dag{{\it dag}} +\def\DOT{{\it DOT}} +\newcommand{\lastedited}{October 7, 2009} +\date{\lastedited} +\newcommand{\mymark}{{\it dot} User's Manual, \lastedited \hfil } +\markboth{\mymark}{\mymark} +\begin{document} +\bibliographystyle{alpha} +\title{Drawing graphs with \dot} +\maketitle +\begin{abstract} +\noindent +{\dot} draws directed graphs as hierarchies. +It runs as a command line program, web visualization +service, or with a compatible graphical interface. +Its features include well-tuned layout algorithms +for placing nodes and edge splines, edge labels, +``record'' shapes with ``ports'' for drawing data structures; +cluster layouts; and an underlying file language for +stream-oriented graph tools. +Below is a reduced module dependency graph of an SML-NJ compiler +that took 0.23 seconds of user time on a 3 GHz Intel Xeon. + +\vspace*{.25in} +\centerline{ + \includegraphics[width=4.0in]{smlred} +} +\end{abstract} + +\newpage +\section{Basic Graph Drawing} + +\if 0 +{\bf The attributes z and quantum are not described, though they +appear in the tables. The original document describes the edge id +attribute. As far as I can tell, this isn't implemented. +All details are here and up-to-date. +The question is which, if any, should be removed, +and should the document structure be changed. Some of the +appendices might belong in the main body, and parts of the main +body (e.g., the attribute tables and command line information) +might be better in the appendix. Maybe the Node and Edge Placement +section should appear before Drawing Size and Spacing. +The figures should probably be regenerated using dot, and we might +want to redo the timing for the abstract figure.} +\fi + +\dot\ draws directed graphs. It reads attributed graph text files and +writes drawings, either as graph files or in a graphics format +such as GIF, PNG, SVG, PDF, or PostScript (which can also be converted +to PDF with some additional features not in the native PDF driver). + +\dot\ draws graphs in four main phases. +Knowing this helps you to understand what kind of +layouts \dot\ makes and how you can control them. +The layout procedure used by \dot\ relies on the graph +being acyclic. Thus, the first step is to break any +cycles which occur in the input graph by reversing +the internal direction of certain cyclic edges. +The next step assigns nodes to discrete ranks or levels. +In a top-to-bottom drawing, ranks determine $Y$ coordinates. +Edges that span more than one rank are broken into chains +of ``virtual'' nodes and unit-length edges. +The third step orders nodes within ranks to avoid crossings. +The fourth step sets $X$ coordinates of nodes to keep edges short, +and the final step routes edge splines. +This is the same general approach as most hierarchical graph drawing +programs, based on the work of Warfield \cite{warfield}, +Carpano \cite{carpano} and Sugiyama \cite{stt}. +We refer the reader to \cite{gknv:methods} +for a thorough explanation of \dot's algorithms. + +\dot\ accepts input in the \DOT\ language (cf. Appendix~\ref{grammar}). +This language describes three main kinds of objects: +graphs, nodes, and edges. +The main (outermost) graph can be directed +({\tt digraph}) or undirected {\tt graph}. +Because \dot\ makes layouts of directed graphs, +all the following examples use {\tt digraph}. +(A separate layout utility, {\it neato}, +draws undirected graphs \cite{neatoguide}.) +Within a main graph, a {\tt subgraph} defines a +subset of nodes and edges. + +Figure~\ref{fig:graph1} is an example graph in the \DOT\ language. +Line 1 gives the graph name and type. +The lines that follow create nodes, edges, or subgraphs, +and set attributes. Names of all these objects may be +C identifiers, numbers, or quoted C strings. +Quotes protect punctuation and white space. + +\begin{figure}[p] +\begin{verbatim} +1: digraph G { +2: main -> parse -> execute; +3: main -> init; +4: main -> cleanup; +5: execute -> make_string; +6: execute -> printf +7: init -> make_string; +8: main -> printf; +9: execute -> compare; +10: } +\end{verbatim} +\caption{Small graph} +\label{fig:graph1} +\end{figure} + +\begin{figure}[p] + \centerline { + \includegraphics[width=3.0in]{graph1} + } + \caption{Drawing of small graph} + \label{fig:drawing1} +\end{figure} + +A node is created when its name first appears in the file. +An edge is created when nodes are joined by the edge operator \verb"->". +In the example, line 2 makes edges from {\it main} to {\it parse}, +and from {\it parse} to {\it execute}. +Running \dot\ on this file (call it \verb"graph1.dot") +\begin{verbatim} + $ dot -Tps graph1.dot -o graph1.ps +\end{verbatim} +yields the drawing of Figure~\ref{fig:drawing1}. +The command line option \verb"-Tps" selects PostScript (EPSF) output. +\verb"graph1.ps" may be printed, displayed by a PostScript viewer, +or embedded in another document. + +It is often useful to adjust the representation or placement of nodes +and edges in the layout. This is done by setting attributes of nodes, +edges, or subgraphs in the input file. +Attributes are name-value pairs of character strings. +Figures~\ref{fig:graph2} and \ref{fig:drawing2} illustrate +some layout attributes. In the listing of Figure~\ref{fig:graph2}, +line 2 sets the graph's {\tt size} to {\tt 4,4} +(in inches).\footnote{Generally, input dimensions are in inches; +output is in 1/72s of an inch, equal to one {\it point} in Postscript. +You can override the default input scaling with the \verb"-s" command argument, +typically, \verb"-s 72" to scale the input in points. We know it is bad +to have different input and output scales as well as not to have some +way to specify units explicitly and we plan to correct that.} +This attribute controls the size of the drawing; if the drawing is +too large, it is scaled as necessary to fit. + +Node or edge attributes are set off in square brackets. +In line 3, the node \verb"main" is assigned shape \verb"box". +The edge in line 4 is straightened by increasing its +\verb"weight" (the default is \verb"1"). +The edge in line 6 is drawn as a dotted line. +Line 8 makes edges from {\tt execute} to {\tt make\_string} and {\tt printf}. +In line 10 the default edge color is set to \verb"red". +This affects any edges created after this point in the file. +Line 11 makes a bold edge labeled {\tt 100 times}. +In line 12, node \verb"make_string" is given a multi-line label. +Line 13 changes the default node to be a box filled with a shade of blue. +The node {\tt compare} inherits these values. + +\begin{figure}[p] +\begin{verbatim} +1: digraph G { +2: size ="4,4"; +3: main [shape=box]; /* this is a comment */ +4: main -> parse [weight=8]; +5: parse -> execute; +6: main -> init [style=dotted]; +7: main -> cleanup; +8: execute -> { make_string; printf} +9: init -> make_string; +10: edge [color=red]; // so is this +11: main -> printf [style=bold,label="100 times"]; +12: make_string [label="make a\nstring"]; +13: node [shape=box,style=filled,color=".7 .3 1.0"]; +14: execute -> compare; +15: } +\end{verbatim} +\caption{Fancy graph} +\label{fig:graph2} +\end{figure} + +\begin{figure}[p] + \centerline { + \includegraphics[width=2.5in]{graph2} + } + \caption{Drawing of fancy graph} + \label{fig:drawing2} +\end{figure} + +\section{Drawing Attributes} + +The complete list of attributes that affect graph drawing +is summarized in Tables~\ref{tab:nattr}, \ref{tab:eattr} and \ref{tab:gattr}. + +\subsection{Node Shapes} +\label{sect:shape} + +Nodes are drawn, by default, with {\tt shape=ellipse}, {\tt width=.75}, +{\tt height=.5} and labeled by the node name. +Other common shapes include {\tt box}, {\tt circle}, {\tt record} +and {\tt plaintext}. +A complete list of node shapes is given in Appendix~\ref{app:shapes}. +The node shape {\tt plaintext} is of particularly interest in +that it draws a node without any outline, an important convention +in some kinds of diagrams. In cases where the graph structure is of +main concern, and especially when the graph is moderately large, the +{\tt point} shape reduces nodes to display minimal content. +When drawn, a node's actual size is the greater of the requested +size and the area needed for its text label, unless {\tt fixedsize=true}, +in which case the {\tt width} and {\tt height} values are enforced. + +Node shapes fall into two broad categories: polygon-based and +record-based.\footnote{There is a way to implement custom node shapes, +using {\tt shape=epsf} and the {\tt shapefile} attribute, and +relying on PostScript output. +The details are beyond the scope of this user's guide. +Please contact the authors for further information.} All node +shapes except {\tt record} and {\tt Mrecord} are considered polygonal, +and are modeled by the number of sides (ellipses and circles being +special cases), and a few other geometric properties. Some of these +properties can be specified in a graph. If {\tt regular=true}, the +node is forced to be regular. The parameter {\tt peripheries} sets +the number of boundary curves drawn. For example, a doublecircle +has {\tt peripheries=2}. +The {\tt orientation} attribute specifies a clockwise rotation of the +polygon, measured in degrees. + +The shape {\tt polygon} exposes all the polygonal parameters, and +is useful for creating many shapes that are not predefined. +In addition to the parameters {\tt regular}, {\tt peripheries} and +{\tt orientation}, mentioned above, polygons are parameterized by +number of sides {\tt sides}, {\tt skew} and {\tt distortion}. +{\tt skew} is a floating point number (usually between $-1.0$ and $1.0$) +that distorts the shape by slanting it from top-to-bottom, +with positive values moving the top of the polygon to the right. +Thus, {\tt skew} can be used to turn a box into a parallelogram. +{\tt distortion} shrinks the polygon from top-to-bottom, with negative +values causing the bottom to be larger than the top. {\tt distortion} +turns a box into a trapezoid. A variety of these polygonal attributes +are illustrated in Figures~\ref{fig:polygons} and~\ref{fig:polylist}. + +\begin{figure}[p]\footnotesize +\begin{verbatim} +1: digraph G { +2: a -> b -> c; +3: b -> d; +4: a [shape=polygon,sides=5,peripheries=3,color=lightblue,style=filled]; +5: c [shape=polygon,sides=4,skew=.4,label="hello world"] +6: d [shape=invtriangle]; +7: e [shape=polygon,sides=4,distortion=.7]; +8: } +\end{verbatim} +\caption{Graph with polygonal shapes} +\label{fig:polylist} +\end{figure} +\begin{figure}[p] + \centerline { + \includegraphics{poly} + } + \caption{Drawing of polygonal node shapes} + \label{fig:polygons} + \vspace*{.5in} % tweak to make this figure use rest of page +\end{figure} + +Record-based nodes form the other class of node shapes. +These include the +shapes {\tt record} and {\tt Mrecord}. The two are identical +except that the latter has rounded corners. These nodes represent +recursive lists of fields, which are drawn as alternating horizontal +and vertical rows of boxes. The recursive structure is determined by +the node's {\tt label}, which has the following schema: \\ +\begin{table}[h] +\begin{tabular}{lll} +{\it rlabel} & $\rightarrow$ & {\it field} ( '$|$' {\it field} )* \\ +{\it field} & $\rightarrow$ & {\it boxLabel} $|$ '{' {\it rlabel} '}' \\ +{\it boxLabel} & $\rightarrow$ & [ '$<$' {\it string} '$>$' ] [ {\it string} ] \\ +\end{tabular} +\end{table} + +Literal braces, vertical bars and angle brackets must be escaped. +Spaces are interpreted as separators between tokens, so they +must be escaped if they are to appear literally in the text. +The first string in a {\it boxLabel} gives a name to the field, +and serves as a port name for the box (cf. Section~\ref{sect:ports}). +The second string is used as a label for the field; +it may contain the same escape sequences as multi-line +labels (cf. Section~\ref{sect:labels}. +The example of Figures~\ref{fig:record} and \ref{fig:recorddrawing} +illustrates the use and some properties of records. + +\begin{figure}[p]\footnotesize +\begin{verbatim} +1: digraph structs { +2: node [shape=record]; +3: struct1 [shape=record,label=" left| mid\ dle| right"]; +4: struct2 [shape=record,label=" one| two"]; +5: struct3 [shape=record,label="hello\nworld |{ b |{c| d|e}| f}| g | h"]; +6: struct1 -> struct2; +7: struct1 -> struct3; +8: } +\end{verbatim} +\caption{Records with nested fields} +\label{fig:record} +\end{figure} +\begin{figure}[p] + \centerline { + \includegraphics{recordex} + } + \caption{Drawing of records} + \label{fig:recorddrawing} +\end{figure} + +\subsection{Labels} +\label{sect:labels} + +As mentioned above, the default node label is its name. +Edges are unlabeled by default. +Node and edge labels can be set explicitly using the {\tt label} +attribute as shown in +Figure~\ref{fig:drawing2}. + +Though it may be convenient to label nodes by name, at other times +labels must be set explicitly. For example, in drawing a file +directory tree, one might have several directories named {\tt src}, +but each one must have a unique node identifier. +The inode number or full path name are suitable unique identifiers. +Then the label of each node can be set to the file name within +its directory. + +Multi-line labels can be created by using the escape +sequences \verb"\n", \verb"\l", \verb"\r" to terminate +lines that are centered, or left or right justified.\footnote{The escape +sequence $\backslash$N is an internal symbol for node names.} + +%The node shape {\tt Mdiamond}, {\tt Msquare} and {\tt Mcircle} +%use the attributes {\tt toplabel} and {\tt bottomlabel} to specify +%additional labels appearing near the top and bottom of the nodes, +%respectively. + +Graphs and cluster subgraphs may also have labels. Graph labels +appear, by default, centered below the graph. Setting {\tt labelloc=t} +centers the label above the graph. Cluster labels appear within the +enclosing rectangle, in the upper left corner. The value {\tt labelloc=b} +moves the label to the bottom of the rectangle. The setting +{\tt labeljust=r} moves the label to the right. + +The default font is 14-point Times-Roman, in black. +Other font families, sizes and colors may be selected using the +attributes {\tt fontname}, {\tt fontsize} and {\tt fontcolor}. +Font names should be compatible with the target interpreter. +It is best to use only the standard font families +Times, Helvetica, Courier or Symbol as these are guaranteed to work +with any target graphics language. +For example, \verb"Times-Italic", \verb"Times-Bold", and \verb"Courier" +are portable; {\tt AvanteGarde\-DemiOblique} isn't. + +For bitmap output, such as GIF or JPG, \dot\ relies on having these +fonts available during layout. Most precompiled installations of +Graphviz use the fontconfig library for matching font names to +available fontfiles. fontconfig comes with a set of utilities for +showing matches and installing fonts. Please refer to the fontconfig +documentation, or the external Graphviz FontFAQ or for further details. +If Graphviz is built without fontconfig (which usually means you +compiled it from source code on your own), the {\tt fontpath} attribute +can specify a list of directories\footnote{For Unix-based systems, this is +a concatenated list of pathnames, separated by colons. For Windows-based +systems, the pathnames are separated by semi-colons.} which should be +searched for the font files. If this is not set, +\dot\ will use the DOTFONTPATH environment variable or, if this is not +set, the GDFONTPATH environment variable. If none of these is set, \dot\ +uses a built-in list. + +Edge labels are positioned near the center of the edge. Usually, care +is taken to prevent the edge label from overlapping edges and +nodes. It can still be difficult, in a complex graph, to be certain +which edge a label belongs to. If the {\tt decorate} attribute is set +to true, a line is drawn connecting the label to its edge. Sometimes +avoiding collisions among edge labels and edges forces the +drawing to be bigger than desired. If {\tt labelfloat=true}, +\dot\ does not try to prevent such overlaps, allowing a more compact +drawing. + +An edge can also specify additional labels, using {\tt headlabel} and +{\tt taillabel}, which are be placed near the ends of the edge. +The characteristics of these labels are specified using the attributes +{\tt labelfontname}, {\tt labelfontsize} and {\tt labelfontcolor}. +These labels are placed near the intersection of the edge and the node +and, as such, may interfere with them. To tune a drawing, the user can +set the {\tt labelangle} and {\tt labeldistance} attributes. +The former sets the angle, in degrees, which the label is rotated from +the angle the edge makes incident with the node. +The latter sets a multiplicative scaling factor to adjust the distance +that the label is from the node. + +\begin{table}[p] +\begin{tabular}[t]{|l|l|p{3.0in}|} \hline +Name & Default & Values \\ \hline +%{\tt bottomlabel} & & auxiliary label for nodes of {\tt shape} M* \\ +{\tt color} & {\tt black} & node shape color \\ +{\tt colorscheme} & X11 & scheme for interpreting color names \\ +{\tt comment} & & any string (format-dependent) \\ +{\tt distortion} & {\tt 0.0} & node distortion for {\tt shape=polygon} \\ +{\tt fillcolor} & {\tt lightgrey/black} & node fill color \\ +{\tt fixedsize} & false & label text has no affect on node size \\ +{\tt fontcolor} & {\tt black} & type face color \\ +{\tt fontname} & {\tt Times-Roman} & font family \\ +{\tt fontsize} & {\tt 14} & point size of label \\ +{\tt group} & & name of node's horizontal alignment group \\ +{\tt height} & {\tt .5} & height in inches \\ +{\tt id} & & any string (user-defined output object tags) \\ +{\tt image} & & image file name \\ +{\tt imagescale} & false & true, width, height, both \\ +{\tt label} & node name & any string \\ +{\tt labelloc} & c & node label vertical alignment \\ +{\tt layer} & overlay range & {\tt all}, {\it id} or {\it id:id} \\ +{\tt margin} & 0.11,0.55 & space around label \\ +{\tt nojustify} & false & if true, justify to label, not node \\ +{\tt orientation} & {\tt 0.0} & node rotation angle \\ +{\tt penwidth} & 1.0 & width of pen for drawing boundaries, in points \\ +{\tt peripheries} & {\tt shape-dependent} & number of node boundaries \\ +{\tt pos} & & input coordinate \\ +{\tt regular} & false & force polygon to be regular \\ +{\tt root} & false & set center node in circo and twopi \\ +{\tt samplepoints} & 8 or 20 & number vertices to convert circle or ellipse \\ +{\tt shape} & {\tt ellipse} & node shape; see Section~\ref{sect:shape} and +Appendix~\ref{app:shapes}\\ +% {\tt shapefile} & & (deprecated, shape file)\\ +{\tt sides} & {\tt 4} & number of sides for {\tt shape=polygon} \\ +{\tt skew} & {\tt 0.0} & skewing of node for {\tt shape=polygon} \\ +{\tt sortv} & & sort key to control array packing order \\ +{\tt style} & & graphics options, e.g. {\tt bold, dotted, filled}; +cf. Section~\ref{sect:style} \\ +{\tt target} & & if URL is set, determines browser window for URL \\ +{\tt tooltip} & label & tooltip annotation \\ +%{\tt toplabel} & & auxiliary label for nodes of {\tt shape} M* \\ +{\tt URL} & & URL associated with node (format-dependent) \\ +{\tt width} & {\tt .75} & width in inches \\ +{\tt z} & {\tt 0.0} & z coordinate (deprecated, use {\tt pos}, {\tt dim}) \\ +\hline +\end{tabular} +\caption{Node attributes} +\label{tab:nattr} +\end{table} + +\begin{table}[p] +\begin{tabular}[t]{|l|l|p{3.5in}|} \hline +Name & Default & Values \\ \hline +{\tt arrowhead} & normal & style of arrowhead at head end \\ +{\tt arrowsize} & {\tt 1.0} & scaling factor for arrowheads \\ +{\tt arrowtail} & normal & style of arrowhead at tail end \\ +{\tt color} & {\tt black} & edge stroke color \\ +{\tt colorscheme} & X11 & scheme for interpreting color names \\ +{\tt comment} & & any string (format-dependent) \\ +{\tt constraint} & true & use edge to affect node ranking \\ +{\tt decorate} & & if set, draws a line connecting labels with their edges \\ +{\tt dir} & {\tt forward} & {\tt forward}, {\tt back}, {\tt both}, or {\tt none} \\ +{\tt edgeURL} & & URL attached to non-label part of edge \\ +{\tt edgehref} & & synonym for edgeURL \\ +{\tt edgetarget} & & if URL is set, determines browser window for URL \\ +{\tt edgetooltip} & label & tooltip annotation for non-label part of edge \\ +{\tt fontcolor} & {\tt black} & type face color \\ +{\tt fontname} & {\tt Times-Roman} & font family \\ +{\tt fontsize} & {\tt 14} & point size of label \\ +{\tt headclip} & true & if false, edge is not clipped to head node boundary \\ +{\tt headhref} & & synonym for headURL \\ +{\tt headlabel} & & label placed near head of edge \\ +{\tt headport} & & {\tt n,ne,e,se,s,sw,w,nw}\\ +{\tt headtarget} & & if headURL is set, determines browser window for URL \\ +{\tt headtooltip} & label & tooltip annotation near head of edge \\ +{\tt headURL} & & URL attached to head label if output format is {\tt ismap} \\ +{\tt href} & & alias for URL \\ +{\tt id} & & any string (user-defined output object tags) \\ +{\tt label} & & edge label \\ +{\tt labelangle} & {\tt -25.0} & angle in degrees which head or tail label +is rotated off edge \\ +{\tt labeldistance} & {\tt 1.0} & scaling factor for distance of head or tail label from node \\ +{\tt labelfloat} & false & lessen constraints on edge label placement \\ +{\tt labelfontcolor} & {\tt black} & type face color for head and tail labels\\ +{\tt labelfontname} & {\tt Times-Roman} & font family for head and tail labels\\ +{\tt labelfontsize} & {\tt 14} & point size for head and tail labels \\ +{\tt labelhref} & & synonym for labelURL \\ +{\tt labelURL} & & URL for label, overrides edge URL \\ +{\tt labeltarget} & & if URL or labelURL is set, determines browser window for URL \\ +{\tt labeltooltip} & label & tooltip annotation near label \\ +{\tt layer} & overlay range & {\tt all}, {\it id} or {\it id:id} \\ +{\tt len} & 1.0 & preferred edge length in neato \\ +{\tt lhead} & & name of cluster to use as head of edge \\ +{\tt ltail} & & name of cluster to use as tail of edge \\ +{\tt minlen} & {\tt 1} & minimum rank distance between head and tail \\ +{\tt penwidth} & 1.0 & width of pen for drawing edge stroke, in points \\ +{\tt samehead} & & tag for head node; edge heads with the same tag are merged onto +the same port \\ +{\tt sametail} & & tag for tail node; edge tails with the same tag are merged onto +the same port \\ +{\tt style} & & graphics options, e.g. {\tt bold, dotted, filled}; cf. +Section~\ref{sect:style} \\ +{\tt tailclip} & true & if false, edge is not clipped to tail node boundary \\ +{\tt tailhref} & & synonym for tailURL \\ +{\tt taillabel} & & label placed near tail of edge \\ +{\tt tailport} & & {\tt n,ne,e,se,s,sw,w,nw}\\ +{\tt tailtarget} & & if tailURL is set, determines browser window for URL \\ +{\tt tailtooltip} & label & tooltip annotation near tail of edge \\ +{\tt tailURL} & & URL attached to tail label if output format is {\tt ismap} \\ +{\tt target} & & if URL is set, determines browser window for URL \\ +{\tt tooltip} & label & tooltip annotation \\ +{\tt weight} & {\tt 1} & integer cost of stretching an edge \\ +\hline +\end{tabular} +\caption{Edge attributes} +\label{tab:eattr} +\end{table} + +\begin{table}[p]\footnotesize +\begin{tabular}[t]{|l|l|p{3.5in}|} \hline +Name & Default & Values \\ \hline +{\tt aspect} & & controls aspect ratio adjustment in dot \\ +{\tt bgcolor} & & background color for drawing, plus initial fill color \\ +{\tt center} & false & center drawing on {\tt page} \\ +{\tt clusterrank} & {\tt local} & may be {\tt global} or {\tt none} \\ +{\tt color} & {\tt black} & for clusters, outline color, and fill color +if {\tt fillcolor} not defined \\ +{\tt colorscheme} & X11 & scheme for interpreting color names \\ +{\tt comment} & & any string (format-dependent) \\ +{\tt compound} & false & allow edges between clusters \\ +{\tt concentrate} & false & enables edge concentrators \\ +{\tt Damping} & 0.99 & solver parameter in neato \\ +{\tt defaultdist} & 1+(avg. len)*sqrt(|V|) & solver parameter in neato \\ +{\tt dim} & 2 & number of coordinate dimensions for layout \\ +{\tt dimen} & 2 & number of coordinate dimensions for rendering \\ +{\tt diredgeconstraints} & & if true, sets directed edges in neato ipsep \\ +{\tt dpi} & 96 & dots per inch for image output \\ +{\tt epsilon} & .0001 & neato terminating condition \\ +{\tt esep} & 3 & edge spline separation from nodes, in points \\ +{\tt fillcolor} & {\tt black} & cluster fill color \\ +{\tt fontcolor} & {\tt black} & type face color \\ +{\tt fontname} & {\tt Times-Roman} & font family \\ +{\tt fontnames} & & {\tt svg}, {\tt ps}, {\tt gd} (SVG only) \\ +{\tt fontpath} & & list of directories to search for fonts \\ +{\tt fontsize} & {\tt 14} & point size of label \\ +{\tt id} & & any string (user-defined output object tags) \\ +{\tt K} & 0.3 & solver parameter in fdp, sfdp \\ +{\tt label} & & any string \\ +{\tt labeljust} & centered & "l" and "r" for left- and right-justified +cluster labels, respectively \\ +{\tt labelloc} & top & "t" and "b" for top- and bottom-justified cluster +labels, respectively \\ +{\tt landscape} & & if true, means orientation=landscape \\ +{\tt layers} & & {\it id:id:id...} \\ +{\tt layersep} & : & specifies separator character to split {\tt layers} \\ +{\tt layout} & & layout module: {\tt dot}, {\tt neato}, etc. (try dot -K?) \\ +{\tt margin} & {\tt .5} & margin included in {\tt page}, inches \\ +{\tt maxiter} & & terminating condition for solver \\ +{\tt mclimit} & {\tt 1.0} & scale factor for mincross iterations \\ +{\tt mindist} & {\tt 1.0} & minimum separation between all nodes (not dot)\\ +{\tt mode} & major & neato solve: major, KK, hier ipsep \\ +{\tt model} & shortpath & network distance model (also circuit and subset)\\ +{\tt nodesep} & {\tt .25} & separation between nodes, in inches. \\ +{\tt nojustify} & false & if true, justify to label, not graph \\ +{\tt normalize} & & if {\tt true} then adjust coordinates so first node is at the origin and first edge is horizontal \\ +{\tt nslimit} & & if set to {\it f}, bounds network simplex iterations by {\it (f)(number of nodes)} when setting x-coordinates \\ +{\tt nslimit1} & & if set to {\it f}, bounds network simplex iterations by {\it (f)(number of nodes)} when ranking nodes \\ +{\tt ordering} & & if {\tt out} out edge order is preserved \\ +{\tt orientation} & {\tt portrait} & if {\tt rotate} is not used and the value +is {\tt landscape}, use landscape orientation \\ +{\tt outputorder} & breadthfirst & or nodesfirst, edgesfirst \\ +{\tt pack} & & if true, apply packing algorithm to components \\ +{\tt packMode} & & node, clust, graph, or \verb"array[_flags][%d]" \\ +{\tt page} & & unit of pagination, {\it e.g.} {\tt "8.5,11"} \\ +{\tt pagedir} & {\tt BL} & traversal order of pages \\ +{\tt pencolor} & black & color for drawing cluster boundaries \\ +{\tt penwidth} & 1.0 & width of pen for drawing boundaries, in points \\ +{\tt peripheries} & 1 & number of cluster boundaries \\ +{\tt quadtree} & & quadtree scheme to use (0=false, 1=true, 2=fast)\\ +{\tt quantum} & & if {\tt quantum} > 0.0, node label dimensions will be +rounded to integral multiples of {\tt quantum} \\ +{\tt rank} & & {\tt same}, {\tt min}, {\tt max}, {\tt source} or {\tt sink} \\ +{\tt rankdir} & {\tt TB} & {\tt LR} (left to right) or {\tt TB} (top to bottom) \\ +{\tt ranksep} & {\tt .75} & separation between ranks, in inches. \\ +{\tt ratio} & & approximate aspect ratio desired, {\tt fill} or {\tt auto} \\ +{\tt remincross} & & if true and there are multiple clusters, re-run crossing +minimization \\ +{\tt repulsiveforce} & 1.0 & parameter for force model \\ +{\tt rotate} & & If 90, set orientation to landscape \\ +{\tt samplepoints} & {\tt 8} & number of points used to represent ellipses +and circles on output (cf. Appendix~\ref{sect:output} \\ +{\tt searchsize} & {\tt 30} & maximum edges with negative cut values to +check when looking for a minimum one during network simplex \\ +{\tt sep} & 1 & margin around nodes in node overlap removal \\ +{\tt size} & & maximum drawing size, in inches \\ +{\tt smoothing} & & method for smoothing node distribution after layout \\ +{\tt sortv} & & sort key to control array packing order \\ +{\tt splines} & & draw edges as splines, polylines \\ +{\tt start} & & initial placement: regular, self, random \\ +{\tt style} & & graphics options, e.g. {\tt filled} for clusters \\ +{\tt stylesheet} & & pathname or URL to XML style sheet for SVG \\ +{\tt target} & & if URL is set, determines browser window for URL \\ +{\tt tooltip} & label & tooltip annotation for cluster \\ +{\tt truecolor} & & if set, force 24 bit or indexed color in image output \\ +{\tt viewport} & & clipping window on output \\ +{\tt voro_margin} & & scale up factor in Voronoi overlap removal \\ +{\tt URL} & & URL associated with graph (format-dependent) \\ +\hline +\end{tabular} +\caption{Graph attributes} +\label{tab:gattr} +\end{table} + +\subsection{Graphics Styles} +\label{sect:style} + +Nodes and edges can specify a {\tt color} attribute, with black +the default. This is the color used to draw the node's shape +or the edge. A {\tt color} value can be a hue-saturation-brightness triple +(three floating point numbers between 0 and 1, separated by commas); +one of the colors names listed in Appendix~\ref{app:colors} +(borrowed from some version of the X window system); or +a red-green-blue (RGB) triple\footnote{A fourth form, RGBA, is also supported, +which has the same format as RGB with an additional fourth hexadecimal +number specifying alpha channel or transparency information.} +(three hexadecimal number between 00 and FF, preceded by the character '\#'). +Thus, the values {\tt "orchid"}, {\tt "0.8396,0.4862,0.8549"} and +{\tt "\#DA70D6"} are three ways to specify the same color. +The numerical forms are convenient for scripts or tools that +automatically generate colors. +Color name lookup is case-insensitive and ignores non-alphanumeric +characters, so \verb'warmgrey' and \verb'Warm_Grey' are equivalent. + +We can offer a few hints regarding use of color in graph drawings. +First, avoid using too many bright colors. +A ``rainbow effect'' is confusing. +It is better to choose a narrower range of colors, or +to vary saturation along with hue. +Second, when nodes are filled with dark or very saturated +colors, labels seem to be more readable with \verb"fontcolor=white" +and \verb"fontname=Helvetica". (We also have PostScript functions +for \dot\ that create outline fonts from plain fonts.) +Third, in certain output formats, you can define your own color space. +For example, if using PostScript for output, you can redefine +\verb"nodecolor", \verb"edgecolor", or \verb"graphcolor" +in a library file. Thus, to use RGB colors, place +the following line in a file \verb"lib.ps". +\begin{verbatim} + /nodecolor {setrgbcolor} bind def +\end{verbatim} +Use the \verb"-l" command line option to load this file. +\begin{verbatim} + dot -Tps -l lib.ps file.dot -o file.ps +\end{verbatim} + +The {\tt style} attribute controls miscellaneous graphics features of +nodes and edges. +This attribute is a comma-separated list of primitives with +optional argument lists. +The predefined primitives include \verb"solid", \verb"dashed", \verb"dotted", +\verb"bold" and \verb"invis". +The first four control line drawing in node boundaries and edges and +have the obvious meaning. The value {\tt invis} causes the node or edge +to be left undrawn. +The style for nodes can also include \verb"filled", +\verb"diagonals" and \verb"rounded". +\verb"filled" shades inside the node +using the color {\tt fillcolor}. If this is not set, the value of +{\tt color} is used. If this also is unset, +light grey\footnote{The default is black if the output format is MIF, +or if the shape is {\tt point}.} is used as the default. +The \verb"diagonals" style causes short diagonal lines to be drawn +between pairs of sides near a vertex. The \verb"rounded" style rounds +polygonal corners. + +User-defined style primitives can be implemented as custom +PostScript procedures. Such primitives are executed inside the +\verb"gsave" context of a graph, node, or edge, before any of its +marks are drawn. The argument lists are translated to PostScript notation. +For example, a node with \verb'style="setlinewidth(8)"' is drawn with a +thick outline. Here, \verb"setlinewidth" is a PostScript built-in, but +user-defined PostScript procedures are called the same way. The +definition of these procedures can be given in a library file loaded +using \verb"-l" as shown above. + +Edges have a \verb"dir" attribute to set arrowheads. +\verb"dir" may be \verb"forward" (the default), \verb"back", \verb"both", +or \verb"none". This refers only to where arrowheads are drawn, and does +not change the underlying graph. For example, setting \verb"dir=back" +causes an arrowhead to be drawn at the tail and no arrowhead at the head, +but it does not exchange the endpoints of the edge. The attributes +{\tt arrowhead} and {\tt arrowtail} specify the style of arrowhead, +if any, which is used at the head and tail ends of the edge. +Allowed values are {\tt normal}, {\tt inv}, {\tt dot}, {\tt invdot}, +{\tt odot}, {\tt invodot} and {\tt none} (cf. Appendix~\ref{app:arrows}). +The attribute {\tt arrowsize} specifies a multiplicative factor affecting +the size of any arrowhead drawn on the edge. +For example, {\tt arrowsize=2.0} makes the arrow twice as long and twice +as wide. + +In terms of style and color, clusters act somewhat like large box-shaped +nodes, in that the cluster boundary is drawn using the cluster's +{\tt color} attribute and, in general, the appearance of the +cluster is affected the {\tt style}, {\tt color} and {\tt fillcolor} +attributes. + +If the root graph has a {\tt bgcolor} attribute specified, this color is used +as the background for the entire drawing, and also serves as the default +fill color. + +\subsection{Drawing Orientation, Size and Spacing} + +Two attributes that play an important role in determining the size of +a \dot\ drawing are {\tt nodesep} and {\tt ranksep}. +The first specifies the minimum distance, in inches, between two +adjacent nodes on the same rank. +The second deals with rank separation, which is the minimum vertical space +between the bottoms of nodes in one rank and the tops of nodes in the next. +The {\tt ranksep} attribute sets the rank separation, in inches. +Alternatively, one can have {\tt ranksep=equally}. This guarantees +that all of the ranks are equally spaced, as measured from the +centers of nodes on adjacent ranks. In this case, the rank separation +between two ranks is at least the default rank separation. As the +two uses of {\tt ranksep} are independent, both can be set at the +same time. For example, {\tt ranksep="1.0 equally"} causes ranks to +be equally spaced, with a minimum rank separation of 1 inch. + +Often a drawing made with the default node sizes and separations +is too big for the target printer or for the space allowed for +a figure in a document. There are several ways to try to deal with +this problem. First, we will review how \dot\ computes the +final layout size. + +A layout is initially made internally at its ``natural'' size, +using default settings (unless {\tt ratio=compress} was set, +as described below). There is no +bound on the size or aspect ratio of the drawing, so if the graph +is large, the layout is also large. If you don't specify {\tt size} +or {\tt ratio}, then the natural size layout is printed. + +The easiest way to control the output size of the drawing is to +set {\tt size="$x$,$y$"} in the graph file (or on the command line +using \verb"-G"). +This determines the size of the final layout. +For example, \verb'size="7.5,10"' fits on an 8.5x11 page +(assuming the default page orientation) +no matter how big the initial layout. + +\verb"ratio" also affects layout size. +There are a number of cases, depending on the settings of {\tt size} +and {\tt ratio}. + +{\bf Case 1.} \verb"ratio" was not set. +If the drawing already fits within the given \verb"size", then nothing happens. +Otherwise, the drawing is reduced uniformly enough to make the critical +dimension fit. + +If \verb"ratio" was set, there are four subcases. + +{\bf Case 2a.} If \verb"ratio="$x$ where $x$ is a floating point number, +then the drawing is scaled up in one dimension to achieve the requested +ratio expressed as drawing $height/width$. +For example, \verb"ratio=2.0" makes the drawing twice as high +as it is wide. Then the layout is scaled using \verb"size" as in Case 1. + +{\bf Case 2b.} If \verb"ratio=fill" and \verb"size="$x,y$ was set, +then the drawing is scaled up in one dimension to achieve the ratio +$y/x$. +Then scaling is performed as in Case 1. +The effect is that all of the bounding box given by \verb"size" is filled. + +{\bf Case 2c.} If \verb"ratio=compress" +and \verb"size="$x,y$ was set, then the initial layout is compressed +to attempt to fit it in the given bounding box. This trades off +layout quality, balance and symmetry in order to pack the layout more tightly. +Then scaling is performed as in Case 1. + +{\bf Case 2d.} If \verb"ratio=auto" and the {\tt page} attribute is +set and the graph cannot be drawn on a single page, +then \verb"size" is ignored and \dot\ computes an ``ideal'' size. +In particular, the size in a given dimension will be the smallest integral +multiple of the page size in that dimension which is at least half +the current size. +The two dimensions are then scaled independently to the new size. +\if 0 +{\bf I don't think this code takes into account page margins or that +the output might be rotated. Should it?} +\fi + +If \verb"rotate=90" is set, or {\tt orientation=landscape}, +then the drawing is rotated $90^\circ$ into landscape mode. +The $X$ axis of the layout would be along the $Y$ axis of each page. +This does not affect \dot's interpretation of \verb"size", +\verb"ratio" or \verb"page". + +At this point, if \verb"page" is not set, then the final layout is +produced as one page. + +If \verb"page="$x,y$ is set, then the layout is printed as a sequence +of pages which can be tiled or assembled into a mosaic. Common settings +are \verb'page="8.5,11"' or \verb'page="11,17"'. These values +refer to the full size of the physical device; the actual area used +will be reduced by the margin settings. +(For printer output, the default is 0.5 inches; +for bitmap-output, the $X$ and $Y$ +margins are 10 and 2 points, respectively.) +For tiled layouts, it may be helpful to set smaller margins. +This can be done +by using the {\tt margin} attribute. This can take a single number, +used to set both margins, or two numbers separated by a comma to set the +$x$ and $y$ margins separately. As usual, units are in inches. Although one can +set \verb"margin=0", unfortunately, many bitmap printers have an +internal hardware margin that cannot be overridden. + +The order in which pages are printed can be controlled by the +{\tt pagedir} attribute. Output is always done using a row-based or +column-based ordering, +and {\tt pagedir} is set to a two-letter code specifying the major +and minor directions. For example, the default is {\tt BL}, specifying +a bottom-to-top ({\tt B}) major order and a left-to-right ({\tt L}) +minor order. Thus, +the bottom row of pages is emitted first, from left to right, then the +second row up, from left to right, and finishing with the top row, +from left to right. The top-to-bottom order is represented by {\tt T} +and the right-to-left order by {\tt R}. + +If {\tt center=true} and the graph can be output on one page, using the +default page size of 8.5 by 11 inches if {\tt page} is not set, the +graph is repositioned to be centered on that page. + +A common problem is that a large graph drawn at a small size +yields unreadable node labels. +To make larger labels, something has to give. +There is a limit to the amount of readable text that can fit on one page. +Often you can draw a smaller graph by extracting an interesting +piece of the original graph before running \dot. +We have some tools that help with this. +\begin{description} +\item [sccmap] decompose the graph into strongly connected components +\item [tred] compute transitive reduction (remove edges implied by transitivity) +\item [gvpr] graph processor to select nodes or edges, and contract +or remove the rest of the graph +\item [unflatten] improve aspect ratio of trees by staggering the lengths +of leaf edges +\end{description} + +With this in mind, here are some thing to try on a given graph: +\begin{enumerate} +\item Increase the node \verb"fontsize". +\item Use smaller \verb"ranksep" and \verb"nodesep". +\item Use \verb"ratio=auto". +\item Use \verb"ratio=compress" and give a reasonable \verb"size". +\item A sans serif font (such as Helvetica) may be more readable than Times +when reduced. +\end{enumerate} + +\subsection{Node and Edge Placement} + +Attributes in \dot\ provide many ways to adjust the large-scale +layout of nodes and edges, as well as fine-tune the drawing to +meet the user's needs and tastes. This section discusses these +attributes\footnote{For completeness, we note that \dot\ also provides +access to various parameters which play technical roles in the +layout algorithms. These include {\tt mclimit}, +{\tt nslimit}, {\tt nslimit1}, {\tt remincross} and {\tt searchsize}.}. + +Sometimes it is natural to make edges point from left to right +instead of from top to bottom. +If \verb"rankdir=LR" in the top-level graph, the drawing is rotated +in this way. \verb"TB" (top to bottom) is the default. The mode +\verb"rankdir=BT" is useful for drawing upward-directed graphs. +For completeness, one can also have \verb"rankdir=RL". + +In graphs with time-lines, or in drawings that emphasize source and sink nodes, +you may need to constrain rank assignments. +The \verb"rank" of a subgraph may be set to {\tt same}, {\tt min}, +{\tt source}, {\tt max} or {\tt sink}. +A value {\tt same} causes all the nodes in the subgraph to occur +on the same rank. If set to {\tt min}, all the nodes in the subgraph +are guaranteed to be on a rank at least as small as any other node in the +layout\footnote{Recall that the minimum rank occurs at the top of a drawing.}. +This can be made strict by setting {\tt rank=source}, which +forces the nodes in the subgraph to be on some rank strictly smaller +than the rank of any other nodes (except those also specified by +{\tt min} or {\tt source} subgraphs). +The values {\tt max} or {\tt sink} play an analogous role for the +maximum rank. +Note that these constraints induce equivalence classes of nodes. If one +subgraph forces nodes {\tt A} and {\tt B} to be on the same rank, and +another subgraph forces nodes {\tt C} and {\tt B} to share a rank, then +all nodes in both subgraphs must be drawn on the same rank. +Figures~\ref{fig:asde91} and \ref{fig:asde91drawing} +illustrate using subgraphs for controlling rank assignment. + +\begin{figure}[p] +\scriptsize +\begin{verbatim} +digraph asde91 { + ranksep=.75; size = "7.5,7.5"; + + { + node [shape=plaintext, fontsize=16]; + /* the time-line graph */ + past -> 1978 -> 1980 -> 1982 -> 1983 -> 1985 -> 1986 -> + 1987 -> 1988 -> 1989 -> 1990 -> "future"; + /* ancestor programs */ + "Bourne sh"; "make"; "SCCS"; "yacc"; "cron"; "Reiser cpp"; + "Cshell"; "emacs"; "build"; "vi"; ""; "RCS"; "C*"; + } + + { rank = same; + "Software IS"; "Configuration Mgt"; "Architecture & Libraries"; + "Process"; + }; + + node [shape=box]; + { rank = same; "past"; "SCCS"; "make"; "Bourne sh"; "yacc"; "cron"; } + { rank = same; 1978; "Reiser cpp"; "Cshell"; } + { rank = same; 1980; "build"; "emacs"; "vi"; } + { rank = same; 1982; "RCS"; ""; "IMX"; "SYNED"; } + { rank = same; 1983; "ksh"; "IFS"; "TTU"; } + { rank = same; 1985; "nmake"; "Peggy"; } + { rank = same; 1986; "C*"; "ncpp"; "ksh-i"; ""; "PG2"; } + { rank = same; 1987; "Ansi cpp"; "nmake 2.0"; "3D File System"; "fdelta"; + "DAG"; "CSAS";} + { rank = same; 1988; "CIA"; "SBCS"; "ksh-88"; "PEGASUS/PML"; "PAX"; + "backtalk"; } + { rank = same; 1989; "CIA++"; "APP"; "SHIP"; "DataShare"; "ryacc"; + "Mosaic"; } + { rank = same; 1990; "libft"; "CoShell"; "DIA"; "IFS-i"; "kyacc"; "sfio"; + "yeast"; "ML-X"; "DOT"; } + { rank = same; "future"; "Adv. Software Technology"; } + + "PEGASUS/PML" -> "ML-X"; + "SCCS" -> "nmake"; + "SCCS" -> "3D File System"; + "SCCS" -> "RCS"; + "make" -> "nmake"; + "make" -> "build"; + . + . + . +} +\end{verbatim} +\caption{Graph with constrained ranks} +\label{fig:asde91} +\end{figure} + +\begin{figure}[p] + \centerline { + \includegraphics[width=6in]{asde91} + } + \caption{Drawing with constrained ranks} + \label{fig:asde91drawing} +\end{figure} + +In some graphs, the left-to-right ordering of nodes is important. +If a subgraph has \verb"ordering=out", then out-edges within the +subgraph that have the same tail node wll fan-out from left to right +in their order of creation. (Also note that flat edges involving the +head nodes can potentially interfere with their ordering.) + +There are many ways to fine-tune the layout of nodes and edges. For +example, if the nodes of an edge both have the same {\tt group} +attribute, \dot\ tries to keep the edge straight and avoid +having other edges cross it. +The {\tt weight} of an edge provides another way to keep edges +straight. An edge's {\tt weight} suggests some measure of an edge's importance; +thus, the heavier the weight, the closer together its nodes should be. +\dot\ causes edges with heavier weights to be drawn shorter and straighter. + +Edge weights also play a role when nodes are constrained to the same rank. +Edges with non-zero weight between these nodes +are aimed across the rank in the same direction +(left-to-right, or top-to-bottom in a rotated drawing) as far as possible. +This fact may be exploited to adjust node ordering by placing +invisible edges (\verb'style="invis"') where needed. + +The end points of edges adjacent to the same node can be constrained +using the {\tt samehead} and {\tt sametail} attributes. Specifically, +all edges with the same head and the same value of {\tt samehead} +are constrained to intersect the head node at the same point. The +analogous property holds for tail nodes and {\tt sametail}. + +During rank assignment, the head node of an edge is constrained to be +on a higher rank than the tail node. If the edge has {\tt constraint=false}, +however, this requirement is not enforced. + +In certain circumstances, the user may desire that the end points of +an edge never get too close. This can be obtained by setting the +edge's {\tt minlen} attribute. This defines the minimum difference +between the ranks of the head and tail. For example, if {\tt minlen=2}, +there will always be at least one intervening rank between the head and tail. +Note that this is not concerned with the geometric distance between the +two nodes. + +Fine-tuning should be approached cautiously. \dot\ works +best when it can makes a layout without much ``help'' or +interference in its placement of individual nodes and edges. +Layouts can be adjusted somewhat by increasing the \verb"weight" of +certain edges, or by creating invisible edges or nodes using \verb"style=invis", +and sometimes even by rearranging the order of nodes and edges in the file. +But this can backfire because the layouts are +not necessarily stable with respect to changes in the input graph. +One last adjustment can invalidate all previous changes and make +a very bad drawing. A future project we have in mind is to combine +the mathematical layout techniques of \dot\ with an interactive +front-end that allows user-defined hints and constraints. + +\section{Advanced Features} + +\subsection{Node Ports} +\label{sect:ports} + +A node port is a point where edges can attach to a node. +(When an edge is not attached to a port, it is aimed at the node's center +and the edge is clipped at the node's boundary.) + +Simple ports can be specified by using the {\tt headport} +and {\tt tailport} attributes. These can be assigned one of the +8 compass points {\tt "n"}, {\tt "ne"}, {\tt "e"}, {\tt "se"}, +{\tt "s"}, {\tt "sw"}, {\tt "w"} or {\tt "nw"}. The end of the +node will then be aimed at that position on the node. Thus, if +{\tt tailport=se}, the edge will connect to the tail node at +its southeast ``corner''. + +Nodes with a {\tt record} shape use the record structure to define ports. +As noted above, +this shape represents a record as recursive lists of boxes. If +a box defines a port name, by using the construct +{\tt < {\it port\_name} > } in the box label, +the center of the box can be used a port. +(By default, the edge is clipped to the box's boundary.) +This is done by modifying the node name with the +port name, using the syntax {\tt {\it node\_name}:{\it port\_name}}, +as part of an edge declaration. +Figure~\ref{fig:tree} illustrates the declaration and use of +port names in record nodes, with the resulting drawing shown +in Figure \ref{fig:treedrawing}. + +{\bf DISCLAIMER: At present, simple ports don't work as advertised, even when +they should. There is also the case where we might not want them to work, +e.g., when the tailport=n and the headport=s. Finally, in theory, dot +should be able to allow both types of ports on an edge, since the notions +are orthogonal. There is still the question as to whether the two syntaxes +could be combined, i.e., treat the compass points as reserved port names, +and allow nodename:portname:compassname.} + +\begin{figure}[p]\footnotesize +\begin{verbatim} + 1: digraph g { + 2: node [shape = record,height=.1]; + 3: node0[label = " | G| "]; + 4: node1[label = " | E| "]; + 5: node2[label = " | B| "]; + 6: node3[label = " | F| "]; + 7: node4[label = " | R| "]; + 8: node5[label = " | H| "]; + 9: node6[label = " | Y| "]; + 10: node7[label = " | A| "]; + 11: node8[label = " | C| "]; + 12: "node0":f2 -> "node4":f1; + 13: "node0":f0 -> "node1":f1; + 14: "node1":f0 -> "node2":f1; + 15: "node1":f2 -> "node3":f1; + 16: "node2":f2 -> "node8":f1; + 17: "node2":f0 -> "node7":f1; + 18: "node4":f2 -> "node6":f1; + 19: "node4":f0 -> "node5":f1; + 20: } +\end{verbatim} +\caption{Binary search tree using records} +\label{fig:tree} +\end{figure} + +\begin{figure}[p] + \centerline { + \includegraphics[height=2.5in]{tree} + } + \caption{Drawing of binary search tree} + \label{fig:treedrawing} +\end{figure} + +Figures~\ref{fig:structs} and \ref{fig:structdrawing} +give another example of the use of record nodes and ports. +This repeats the example of +Figures~\ref{fig:record} and \ref{fig:recorddrawing} +but now using ports as connectors for edges. +Note that records sometimes look better if their input height is set +to a small value, so the text labels dominate the actual size, as +illustrated in Figure~\ref{fig:tree}. Otherwise the default node +size ($.75$ by $.5$) is assumed, as in Figure~\ref{fig:structdrawing}. +\begin{figure}[p]\footnotesize +\begin{verbatim} +1: digraph structs { +2: node [shape=record]; +3: struct1 [shape=record,label=" left| middle| right"]; +4: struct2 [shape=record,label=" one| two"]; +5: struct3 [shape=record,label="hello\nworld |{ b |{c| d|e}| f}| g | h"]; +6: struct1:f1 -> struct2:f0; +7: struct1:f2 -> struct3:here; +8: } +\end{verbatim} +\caption{Records with nested fields (revisited)} +\label{fig:structs} +\end{figure} +\begin{figure}[p] + \centerline { + \includegraphics{structs} + } + \caption{Drawing of records (revisited)} + \label{fig:structdrawing} +\end{figure} +The example of Figures~\ref{fig:hashtable} and \ref{fig:hashtabledrawing} +uses left-to-right drawing in a layout of a hash table. +\begin{figure}[p]\footnotesize +\begin{verbatim} + 1: digraph G { + 2: nodesep=.05; + 3: rankdir=LR; + 4: node [shape=record,width=.1,height=.1]; + 5: + 6: node0 [label = " | | | | | | | ",height=2.5]; + 7: node [width = 1.5]; + 8: node1 [label = "{ n14 | 719 |

}"]; + 9: node2 [label = "{ a1 | 805 |

}"]; +10: node3 [label = "{ i9 | 718 |

}"]; +11: node4 [label = "{ e5 | 989 |

}"]; +12: node5 [label = "{ t20 | 959 |

}"] ; +13: node6 [label = "{ o15 | 794 |

}"] ; +14: node7 [label = "{ s19 | 659 |

}"] ; +15: +16: node0:f0 -> node1:n; +17: node0:f1 -> node2:n; +18: node0:f2 -> node3:n; +19: node0:f5 -> node4:n; +20: node0:f6 -> node5:n; +21: node2:p -> node6:n; +22: node4:p -> node7:n; +23: } +\end{verbatim}\vspace*{-.25in} +\caption{Hash table graph file} +\label{fig:hashtable} +\end{figure} + +\begin{figure}[p] + \centerline { + \includegraphics[height=2.5in]{hashtable} + } + \caption{Drawing of hash table} + \label{fig:hashtabledrawing} +\end{figure} + +\subsection{Clusters} + +A cluster is a subgraph placed in its own distinct rectangle of the layout. +A subgraph is recognized as a cluster when its name has the prefix +\verb"cluster". (If the top-level graph has {\tt clusterrank=none}, +this special processing is turned off). +Labels, font characteristics and the {\tt labelloc} attribute can +be set as they would be for the top-level graph, though +cluster labels appear above the graph by default. +For clusters, the label is left-justified by default; +if {\tt labeljust="r"}, the label is right-justified. +The {\tt color} attribute specifies the color of the enclosing rectangle. +In addition, clusters may have {\tt style="filled"}, in which case +the rectangle is filled with the color specified by {\tt fillcolor} +before the cluster is drawn. (If {\tt fillcolor} is not specified, +the cluster's {\tt color} attribute is used.) + +Clusters are drawn by a recursive technique that computes a +rank assignment and internal ordering of nodes within clusters. +Figure~\ref{fig:clust1} through \ref{fig:callgraph} are cluster layouts +and the corresponding graph files. + +\begin{figure}[p] +\begin{minipage}[t]{2.5in} +\footnotesize +\begin{verbatim} +digraph G { + subgraph cluster0 { + node [style=filled,color=white]; + style=filled; + color=lightgrey; + a0 -> a1 -> a2 -> a3; + label = "process #1"; + } + + subgraph cluster1 { + node [style=filled]; + b0 -> b1 -> b2 -> b3; + label = "process #2"; + color=blue + } + start -> a0; + start -> b0; + a1 -> b3; + b2 -> a3; + a3 -> a0; + a3 -> end; + b3 -> end; + + start [shape=Mdiamond]; + end [shape=Msquare]; +} +\end{verbatim} +\end{minipage} \hspace{0.05in} \ +\parbox[t]{2.0in}{ + \ \\ + \centerline { + \includegraphics[width=1.9in]{clust1} + } +} + \caption{Process diagram with clusters} + \label{fig:clust1} +\end{figure} +\clearpage + +\begin{figure}[p] +\footnotesize +\begin{verbatim} +1:digraph G { +2: size="8,6"; ratio=fill; node[fontsize=24]; +3: +4: ciafan->computefan; fan->increment; computefan->fan; stringdup->fatal; +5: main->exit; main->interp_err; main->ciafan; main->fatal; main->malloc; +6: main->strcpy; main->getopt; main->init_index; main->strlen; fan->fatal; +7: fan->ref; fan->interp_err; ciafan->def; fan->free; computefan->stdprintf; +8: computefan->get_sym_fields; fan->exit; fan->malloc; increment->strcmp; +9: computefan->malloc; fan->stdsprintf; fan->strlen; computefan->strcmp; +10: computefan->realloc; computefan->strlen; debug->sfprintf; debug->strcat; +11: stringdup->malloc; fatal->sfprintf; stringdup->strcpy; stringdup->strlen; +12: fatal->exit; +13: +14: subgraph "cluster_error.h" { label="error.h"; interp_err; } +15: +16: subgraph "cluster_sfio.h" { label="sfio.h"; sfprintf; } +17: +18: subgraph "cluster_ciafan.c" { label="ciafan.c"; ciafan; computefan; +19: increment; } +20: +21: subgraph "cluster_util.c" { label="util.c"; stringdup; fatal; debug; } +22: +23: subgraph "cluster_query.h" { label="query.h"; ref; def; } +24: +25: subgraph "cluster_field.h" { get_sym_fields; } +26: +27: subgraph "cluster_stdio.h" { label="stdio.h"; stdprintf; stdsprintf; } +28: +29: subgraph "cluster_" { getopt; } +30: +31: subgraph "cluster_stdlib.h" { label="stdlib.h"; exit; malloc; free; realloc; } +32: +33: subgraph "cluster_main.c" { main; } +34: +35: subgraph "cluster_index.h" { init_index; } +36: +37: subgraph "cluster_string.h" { label="string.h"; strcpy; strlen; strcmp; strcat; } +38:} +\end{verbatim} +\caption{Call graph file} +\label{fig:clust2} +\end{figure} + +\begin{figure}[p] + \centerline { + \includegraphics[width=6.5in]{clust2} + } + \caption{Call graph with labeled clusters} + \label{fig:callgraph} +\end{figure} + +If the top-level graph has the {\tt compound} attribute set to true, +\dot\ will allow edges connecting nodes and clusters. This is accomplished +by an edge defining an {\tt lhead} or {\tt ltail} attribute. The +value of these attributes must be the name of a cluster containing the +head or tail node, respectively. In this case, the edge is clipped at +the cluster boundary. All other edge attributes, such as {\tt arrowhead} +or {\tt dir}, are applied to the truncated edge. For example, +Figure~\ref{fig:compound} shows a graph using the {\tt compound} attribute +and the resulting diagram. + +\begin{figure}[p] +\begin{minipage}[t]{2.25in} +\begin{verbatim} +digraph G { + compound=true; + subgraph cluster0 { + a -> b; + a -> c; + b -> d; + c -> d; + } + subgraph cluster1 { + e -> g; + e -> f; + } + b -> f [lhead=cluster1]; + d -> e; + c -> g [ltail=cluster0, + lhead=cluster1]; + c -> e [ltail=cluster0]; + d -> h; +} +\end{verbatim} +\end{minipage} \hspace{0.5in} \ +\parbox[t]{2.0in}{ + \ \\ + \centerline { + \includegraphics[width=2in]{compound} + } +} + \caption{Graph with edges on clusters} + \label{fig:compound} +\end{figure} + +\subsection{Concentrators} +Setting \verb"concentrate=true" on the top-level graph enables +an edge merging technique to reduce clutter in dense layouts. +Edges are merged when they run parallel, have a common endpoint +and have length greater than 1. +A beneficial side-effect in fixed-sized layouts is that removal +of these edges often permits larger, more readable labels. +While concentrators in \dot\ look somewhat like Newbery's +\cite{newbery:concentrators}, they are found by searching +the edges in the layout, not by detecting complete bipartite graphs in +the underlying graph. Thus the \dot\ approach runs much faster +but doesn't collapse as many edges as Newbery's algorithm. + +\section{Command Line Options} + +By default, \dot\ operates in filter mode, +reading a graph from {\tt stdin}, and +writing the graph on {\tt stdout} in the \DOT\ format with +layout attributes appended. +\dot\ supports a variety of command-line options: + +{\tt-T{\it format}} sets the format of the output. Allowed values +for {\it format} are: + +\begin{description} +\item[{\tt canon}] +Prettyprint input; no layout is done. +\item[{\tt dot}] +Attributed \DOT. Prints input with layout information attached as +attributes, cf. Appendix~\ref{sect:output}. +\item[{\tt fig}] FIG output. +\item[{\tt gd}] GD format. This is the internal format used by the GD Graphics +Library. An alternate format is {\tt gd2}. +\item[{\tt gif}] GIF output. +\item[{\tt hpgl}] HP-GL/2 vector graphic printer language for HP wide bed +plotters. +\item[{\tt imap}] Produces map files for server-side image +maps. This can be combined with a graphical form of the output, e.g., using +{\tt -Tgif} or {\tt -Tjpg}, in web pages to attach links to nodes and edges. +The format {\tt ismap} is a predecessor of the {\tt imap} format. +\item[{\tt cmap}] Produces HTML map files for client-side image maps. +\item[{\tt mif}] FrameMaker MIF format. In this format, graphs can be +loaded into FrameMaker and edited manually. MIF is limited to 8 basic colors. +\item[{\tt mp}] MetaPost output. +\item[{\tt pcl}] PCL-5 output for HP laser writers. +\item[{\tt pdf}] Adobe PDF via the Cairo library. We have seen problems when embedding into other documents. Instead, use -Tps2 as described below. +\item[{\tt pic}] PIC output. +\item[{\tt plain}] Simple, line-based ASCII format. Appendix~\ref{app:plain} +describes this output. An alternate format is {\tt plain-ext}, which +provides port names on the head and tail nodes of edges. +\item[{\tt png}] PNG (Portable Network Graphics) output. +\item[{\tt ps}] PostScript (EPSF) output. +\item[{\tt ps2}] PostScript (EPSF) output with PDF annotations. This output should be distilled into PDF, such as for pdflatex, before being included in +a document. (Use ps2pdf; epstopdf doesn't handle \verb"%%BoundingBox: (atend)".) +\item[{\tt svg}] SVG output. The alternate form {\tt svgz} produces +compressed SVG. +\item[{\tt vrml}] VRML output. +\item[{\tt vtx}] VTX format for r Confluents's Visual Thought. +\item[{\tt wbmp}] Wireless BitMap (WBMP) format. +\end{description} + +{\tt-G{\it name}={\it value}} sets a graph attribute default value. +Often it is convenient to set size, pagination, and related +values on the command line rather than in the graph file. +The analogous flags \verb"-N" or \verb"-E" +set default node or edge attributes. +Note that file contents override command line arguments. + +{\tt-l{\it libfile}} specifies a device-dependent graphics library +file. Multiple libraries may be given. These names are passed to the code +generator at the beginning of output. + +{\tt-o{\it outfile}} writes output into file {\it outfile}. + +\verb"-v" requests verbose output. In processing large layouts, +the verbose messages may give some estimate of \dot's progress. + +\verb"-V" prints the version number and exits. + +\section{Miscellaneous} + +In the top-level graph heading, a graph may be declared a +{\tt strict digraph}. This forbids the creation of self-arcs +and multi-edges; they are ignored in the input file. + +Nodes, edges and graphs may have a {\tt URL} attribute. In certain +output formats ({\tt ps2}, {\tt imap}, {\tt ismap}, {\tt cmap}, or {\tt svg}), +this information is integrated in the output +so that nodes, edges and clusters become active links +when displayed with the appropriate tools. Typically, URLs attached to +top-level graphs serve as base URLs, supporting relative URLs on +components. When the output format is {\tt imap}, or {\tt cmap}, +a similar processing +takes place with the {\tt headURL} and {\tt tailURL} attributes. + +For certain formats ({\tt ps}, {\tt fig}, {\tt mif}, {\tt mp}, +{\tt vtx} or {\tt svg}), {\tt comment} attributes can be used to +embed human-readable notations in the output. + +\section{Conclusions} + +\dot\ produces pleasing hierarchical drawings and can be +applied in many settings. + +Since the basic algorithms of \dot\ work well, we have a good basis for +further research into problems such as methods for drawing large graphs +and on-line (animated) graph drawing. + +\section{Acknowledgments} +We thank Phong Vo for his advice +about graph drawing algorithms and programming. +The graph library uses Phong's splay tree dictionary library. +Also, the users of \dag, the predecessor of \dot, +gave us many good suggestions. +Guy Jacobson and and Randy Hackbarth reviewed earlier +drafts of this manual, and Emden contributed substantially to the +current revision. John Ellson wrote the generalized polygon +shape and spent considerable effort to make it robust and efficient. +He also wrote the GIF and ISMAP generators and other tools +to bring {\it graphviz} to the web. + +\clearpage +\bibliography{graphdraw} + +\appendix +\clearpage +\section{Graph File Grammar} +\label{grammar} + +\newcommand{\lopt}{[} +\newcommand{\ropt}{]} +\newcommand{\lgrp}{(} +\newcommand{\rgrp}{)} +\newcommand{\strict}{{\bf strict}} +\newcommand{\graph}{{\bf graph}} +\newcommand{\digraph}{{\bf digraph}} +\newcommand{\node}{{\bf node}} +\newcommand{\edge}{{\bf edge}} +\newcommand{\subgraph}{{\bf subgraph}} + +The following is an abstract grammar for the \DOT\ language. +Terminals are shown in bold font and nonterminals in italics. +Literal characters are given in single quotes. +Parentheses \lgrp\ and \rgrp\ indicate grouping when needed. +Square brackets \lopt\ and \ropt\ enclose optional items. +Vertical bars $|$ separate alternatives. + +\begin{tabular}{lll} + +{\it graph} & $\rightarrow$ & \lopt \strict \ropt\ \lgrp\digraph\ $|$ \graph\rgrp\ {\it id} '\{' {\it stmt-list} '\}' \\ + +{\it stmt-list} & $\rightarrow$ & \lopt {\it stmt} \lopt';'\ropt\ \lopt {\it stmt-list}\ \ropt\ \ropt \\ + +{\it stmt} & $\rightarrow$ & {\it attr-stmt} $|$ {\it node-stmt} $|$ {\it edge-stmt} $|$ {\it subgraph} $|$ {\it id} '=' {\it id} \\ + +{\it attr-stmt} & $\rightarrow$ & \lgrp\graph\ $|$ \node\ $|$ \edge\rgrp\ {\it attr-list} \\ + +{\it attr-list} & $\rightarrow$ & '[' \lopt {\it a-list} \ropt\ ']' \lopt {\it attr-list}\ropt \\ + +{\it a-list} & $\rightarrow$ & {\it id} '=' {\it id} \lopt','\ropt\ \lopt {\it a-list}\ropt \\ + +{\it node-stmt} & $\rightarrow$ & {\it node-id} \lopt{\it attr-list}\ropt \\ + +{\it node-id} & $\rightarrow$ & {\it id} \lopt {\it port}\ropt \\ +{\it port} & $\rightarrow$ & {\it port-location} \lopt {\it port-angle}\ropt\ + $|$ {\it port-angle} \lopt {\it port-location}\ropt \\ + +{\it port-location} & $\rightarrow$ & ':' {\it id} $|$ ':' '(' {\it id} ',' {\it id} ')' \\ +{\it port-angle} & $\rightarrow$ & '@' {\it id} \\ + +{\it edge-stmt} & $\rightarrow$ & \lgrp{\it node-id} $|$ {\it subgraph}\rgrp\ {\it edgeRHS} \lopt {\it attr-list}\ropt \\ + +{\it edgeRHS} & $\rightarrow$ & {\it edgeop} \lgrp{\it node-id} $|$ {\it subgraph}\rgrp\ \lopt {\it edgeRHS}\ropt \\ + +{\it subgraph} & $\rightarrow$ & \lopt \subgraph\ {\it id}\ropt\ '\{' {\it stmt-list} '\}' $|$ \subgraph\ {\it id} \\ + +\end{tabular} + +An {\it id} is any alphanumeric string not beginning with a digit, +but possibly including underscores; or a number; or any quoted +string possibly containing escaped quotes. + +An {\it edgeop} is \verb"->" in directed graphs and \verb"--" in +undirected graphs. + +The language supports C++-style comments: \verb"/* */" and \verb"//". + +Semicolons aid readability but are not required except in the rare case +that a named subgraph with no body immediate precedes an anonymous +subgraph, because under precedence rules this sequence is parsed as +a subgraph with a heading and a body. + +Complex attribute values may contain characters, such as commas and +white space, which are used in parsing the \DOT\ language. To avoid getting +a parsing error, such values need to be enclosed in double quotes. + +\clearpage +\section{Plain Output File Format ({\tt -Tplain})} +\label{app:plain} +{ +\parindent0pt + +The ``plain'' output format of \dot\ lists node and edge +information in a simple, line-oriented style which is easy +to parse by front-end components. +All coordinates and lengths are unscaled and in inches. + +The first line is: + +\hspace{.5in}\verb"graph" {\it scalefactor width height} + +The {\it width} and {\it height} values give the width and the height +of the drawing; the lower-left corner of the drawing is at the origin. +The {\it scalefactor} indicates how much to scale all coordinates +in the final drawing. + +The next group of lines lists the nodes in the format: + +\hspace{.5in}\verb"node" {\it name x y xsize ysize label style shape color fillcolor } + +The {\it name} is a unique identifier. If it contains whitespace or +punctuation, it is quoted. The {\it x} and {\it y} values give the coordinates +of the center of the node; the {\it width} and {\it height} give the +width and the height. The remaining parameters provide the node's +{\tt label}, {\tt style}, {\tt shape}, {\tt color} and {\tt fillcolor} +attributes, respectively. If the node does not have a {\tt style} attribute, +{\tt "solid"} is used. + +The next group of lines lists edges: + +\hspace{.5in}\verb"edge" {\it tail head $n$ $x_1$ $y_1$ $x_2$ $y_2$ +$\ldots$ $x_n$ $y_n$ {\rm [} label lx ly {\rm ]} style color } + +$n$ is the number of coordinate pairs that follow as B-spline +control points. If the edge is labeled, then the label text and +coordinates are listed next. The edge description is completed by +the edge's {\tt style} and {\tt color}. As with nodes, if a {\tt style} is not +defined, {\tt "solid"} is used. + +The last line is always: + +\hspace{.5in}\verb"stop" +} + +\clearpage +\section{Attributed \DOT\ Format ({\tt -Tdot})} +\label{sect:output} + +This is the default output format. It reproduces the input, +along with layout information for the graph. Coordinate values +increase up and to the right. Positions are represented by two +integers separated by a comma, representing the $X$ and $Y$ coordinates +of the location specified in points (1/72 of an inch). A position +refers to the center of its associated object. +Lengths are given in inches. + +A {\tt bb} attribute is attached to the graph, +specifying the bounding box of the drawing. If the graph has a label, +its position is specified by the {\tt lp} attribute. + +Each node gets {\tt pos}, {\tt width} and {\tt height} attributes. +If the node is a record, the record rectangles are given in the {\tt rects} +attribute. If the node is polygonal and the {\tt vertices} +attribute is defined in the input graph, this attribute contains the +vertices of the node. The number of points produced for circles and ellipses +is governed by the {\tt samplepoints} attribute. + +Every edge is assigned a {\tt pos} attribute, which consists of +a list of $3n + 1$ locations. These are B-spline control points: +points $p_0, p_1, p_2, p_3$ are the first Bezier spline, +$p_3, p_4, p_5, p_6$ are the second, etc. +Currently, edge points are listed top-to-bottom (or left-to-right) +regardless of the orientation of the edge. This may change. + +In the {\tt pos} attribute, the list of control points might +be preceded by a start point $p_s$ and/or an end point $p_e$. These have the +usual position representation with a {\tt "s,"} or {\tt "e,"} +prefix, respectively. A start point is present if there is an +arrow at $p_0$. +In this case, the arrow is from $p_0$ to $p_s$, where +$p_s$ is actually on the node's boundary. The length and direction +of the arrowhead +is given by the vector $(p_s - p_0)$. +If there is no arrow, $p_0$ is on the node's boundary. +Similarly, the point $p_e$ designates an arrow at the other end of the +edge, connecting to the last spline point. + +If the edge has a label, the label position is given in {\tt lp}. + +\clearpage +\section{Layers} +{\dot} has a feature for drawing parts of a single diagram on +a sequence of overlapping ``layers.'' Typically the layers are +overhead transparencies. To activate this feature, one must +set the top-level graph's {\tt layers} attribute to a list of identifiers. +A node or edge can then be assigned to a layer or range of layers +using its {\tt layer} attribute.. +{\tt all} is a reserved name for all layers (and can be +used at either end of a range, e.g {\tt design:all} or {\tt all:code}). +For example: +\begin{verbatim} + layers = "spec:design:code:debug:ship"; + node90 [layer = "code"]; + node91 [layer = "design:debug"]; + node90 -> node91 [layer = "all"]; + node92 [layer = "all:code"]; +\end{verbatim} +In this graph, {\tt node91} is in layers {\tt design}, {\tt code} +and {\tt debug}, while {\tt node92} is in layers {\tt spec}, +{\tt design} and {\tt code}. + +In a layered graph, if a node or edge has no layer assignment, +but incident edges or nodes do, then its layer specification +is inferred from these. To change the default so that nodes +and edges with no layer appear on all layers, insert near +the beginning of the graph file: + +\begin{verbatim} + node [layer=all]; + edge [layer=all]; +\end{verbatim} + +There is currently no way to specify a set of layers that are +not a continuous range. + +When PostScript output is selected, the color sequence for layers +is set in the array {\tt layercolorseq}. This array is indexed +starting from 1, and every element must be a 3-element array which can +interpreted as a color coordinate. The adventurous may +learn further from reading {\dot}'s PostScript output. + +% \clearpage % why does this create a blank page here? +\section{Node Shapes} +\label{app:shapes} +\begin{center} +\begin{tabular}{cccc}\footnotesize +\includegraphics{box} & \includegraphics{polygon} & \includegraphics{ellipse} & \includegraphics{circle} \\ +box & polygon & ellipse & circle \\ +\includegraphics{point} & \includegraphics{egg} & \includegraphics{triangle} & \includegraphics{plaintext} \\ +point & egg & triangle & plaintext \\ +\includegraphics{diamond} & \includegraphics{trapezium} & \includegraphics{parallelogram} & \includegraphics{house} \\ +diamond & trapezium & parallelogram & house \\ +\includegraphics{hexagon} & \includegraphics{octagon} & \includegraphics{doublecircle} & \includegraphics{doubleoctagon} \\ +hexagon & octagon & doublecircle & doubleoctagon \\ +\includegraphics{tripleoctagon} & \includegraphics{invtriangle} & \includegraphics{invtrapezium} & \includegraphics{invhouse} \\ +tripleoctagon & invtriangle & invtrapezium & invhouse \\ +\includegraphics{Mdiamond} & \includegraphics{Msquare} & \includegraphics{Mcircle} & \\ +Mdiamond & Msquare & Mcircle & \\ +\includegraphics{record} & \includegraphics{Mrecord} & & \\ +record & Mrecord & & \\ +\end{tabular} +\end{center} + +\clearpage +\section{Arrowhead Types} +\label{app:arrows} +\begin{center} +\begin{tabular}{ccc} +\includegraphics{normal} & \includegraphics{dot} & \includegraphics{odot} \\ +normal & dot & odot \\ +\includegraphics{inv} & \includegraphics{invdot} & \includegraphics{invodot} \\ +inv & invdot & invodot \\ +\includegraphics{none} & & \\ +none & & \\ +\end{tabular} +\end{center} + +\clearpage +\section{Color Names} +\label{app:colors} +{\footnotesize +\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}llll} +{\bf Whites} & {\bf Reds} & {\bf Yellows} & turquoise[1-4] \cr +antiquewhite[1-4] & coral[1-4] & darkgoldenrod[1-4] \cr +azure[1-4] & crimson & gold[1-4] & {\bf Blues} \cr +bisque[1-4] & darksalmon & goldenrod[1-4] & aliceblue \cr +blanchedalmond & deeppink[1-4] & greenyellow & blue[1-4] \cr +cornsilk[1-4] & firebrick[1-4] & lightgoldenrod[1-4] & blueviolet \cr +floralwhite & hotpink[1-4] & lightgoldenrodyellow & cadetblue[1-4] \cr +gainsboro & indianred[1-4] & lightyellow[1-4] & cornflowerblue \cr +ghostwhite & lightpink[1-4] & palegoldenrod & darkslateblue \cr +honeydew[1-4] & lightsalmon[1-4] & yellow[1-4] & deepskyblue[1-4] \cr +ivory[1-4] & maroon[1-4] & yellowgreen & dodgerblue[1-4] \cr +lavender & mediumvioletred & & indigo \cr +lavenderblush[1-4] & orangered[1-4] & {\bf Greens} & lightblue[1-4] \cr +lemonchiffon[1-4] & palevioletred[1-4] & chartreuse[1-4] & lightskyblue[1-4] \cr +linen & pink[1-4] & darkgreen & lightslateblue[1-4] \cr +mintcream & red[1-4] & darkolivegreen[1-4] & mediumblue \cr +mistyrose[1-4] & salmon[1-4] & darkseagreen[1-4] & mediumslateblue \cr +moccasin & tomato[1-4] & forestgreen & midnightblue \cr +navajowhite[1-4] & violetred[1-4] & green[1-4] & navy \cr +oldlace & & greenyellow & navyblue \cr +papayawhip & {\bf Browns} & lawngreen & powderblue \cr +peachpuff[1-4] & beige & lightseagreen & royalblue[1-4] \cr +seashell[1-4] & brown[1-4] & limegreen & skyblue[1-4] \cr +snow[1-4] & burlywood[1-4] & mediumseagreen & slateblue[1-4] \cr +thistle[1-4] & chocolate[1-4] & mediumspringgreen & steelblue[1-4] \cr +wheat[1-4] & darkkhaki & mintcream \cr +white & khaki[1-4] & olivedrab[1-4] & {\bf Magentas} \cr +whitesmoke & peru & palegreen[1-4] & blueviolet \cr + & rosybrown[1-4] & seagreen[1-4] & darkorchid[1-4] \cr +{\bf Greys} & saddlebrown & springgreen[1-4] & darkviolet \cr +darkslategray[1-4] & sandybrown & yellowgreen & magenta[1-4] \cr +dimgray & sienna[1-4] & & mediumorchid[1-4] \cr +gray & tan[1-4] & {\bf Cyans} & mediumpurple[1-4] \cr +gray[0-100] & & aquamarine[1-4] & mediumvioletred \cr +lightgray & {\bf Oranges} & cyan[1-4] & orchid[1-4] \cr +lightslategray & darkorange[1-4] & darkturquoise & palevioletred[1-4] \cr +slategray[1-4] & orange[1-4] & lightcyan[1-4] & plum[1-4] \cr + & orangered[1-4] & mediumaquamarine & purple[1-4] \cr +{\bf Blacks} & & mediumturquoise & violet \cr +black & & paleturquoise[1-4] & violetred[1-4] \cr +\end{tabular*} +} + +%\tableofcontents +%\coversheet +\end{document} +% +%END -- 2.40.0