Begin main content

Embedding GraphViz in LaTeX documents

I have to say I'm loving using LaTeX for my Uni papers. It is so delightfully straightforward and powerful.

I am embedding some GraphViz diagrams in my documents, but I didn't want a round trip to a different editor buffer and the shell to edit/compile/insert the diagram.

Based on graphviz.tex code by Derek Rayside I have created a custom LaTeX function that will automatically compile and embed inline GraphViz code (man those wacky capitilisations are getting boring!)

You embed a graph like so:

   \digraph[scale=0.5]{MyGraph}{rankdir=LR; a->b; b->c}
Be careful not to have any double newlines or your dot file will have some bogus \par comments in it (which I should replace with newlines in the function...). Another possible enhancement would be to add a dynamic dot command to set the maximum diagram height & width to the current page/column dimensions.

You need my graphviz.sty and you need the following in your document preamble:

   \usepackage[pdftex]{graphicx}
   \usepackage{graphviz}
Remember to run texhash if you install the style in a system-wide location. Note this assumes pdflatex. Modifying the command for regular latex is an exercise left for the reader. Update: Derek now has an updated version available on GitHub (which didn't exist in 2007 :). https://github.com/drayside/graphviz.sty/blob/master/graphviz.sty.

08:09 AM, 25 Mar 2007 by Mark Aufflick Permalink

Todo

Change this style to use the excellent dot2tex: http://www.fauskes.net/nb/introducing-dot2tex/

by Mark Aufflick on 05/21/07

cool

Awesome! This was very useful for me.

by Unregistered Visitor on 02/13/09

Thank you

I really like this, and I fiddled around with dot2tex as suggested in your comment to yourself. Here are my results. I've never written a latex sty file before, so please feel free to improve it.

% graphviz.sty
% by Mark Aufflick
% 2006-03-25
% mark@aufflick.com
% http://mark.aufflick.com/
%
% based on graphviz.tex by Derek Rayside 2003

% add the following lines to your preamble:

% \usepackage[pdftex]{graphicx}
% \usepackage{graphviz}

% parameters to \digraph:
% 1 - parameters for \includegraphics (optional; default value is "scale=1")
% 2 - name of the digraph
% 3 - body of the digraph

% assumes pdflatex. to modify this command for regular latex,
% replace all .pdf with .ps, and the command becomes simply:
% dot -Tps #1.dot

\ProvidesPackage{dottotex}

\newcommand{\dottotex}[2]{ 
  \newwrite\dotfile 
  \immediate\openout\dotfile=#1.dot 
  \immediate\write\dotfile{digraph #1 {\string#2}} 
  \immediate\closeout\dotfile
  \write18{bash -c "`which neato` -Txdot #1.dot | `which dot2tex` -tmath --figonly --usepdflatex -ftikz --tikzedgelabels --styleonly -o #1tikz.tex"}  
  \IfFileExists{#1tikz.tex}
  % the tex exists: include it 
  { \include{#1tikz} } 
  % the tex was not created - show a hint
  { \fbox{ \begin{tabular}{l} 
        The file \texttt{#1tikz.tex} hasn't been created from 
        \texttt{#1.dot} yet. \\
        We attempted to create it with:\\
        `\texttt{neato -Txdot #1.dot | dot2tex  --figonly --usepdflatex -ftikz --tikzedgelabels --styleonly -o #1tikz.tex}` \\
        but that seems not to have worked. You need to execute `\texttt{pdflatex}` with \\
        the `\texttt{-shell-escape}` option.
      \end{tabular}} 
  } 
}

by Unregistered Visitor on 04/02/09

Something to be wary of

You should not have the \newwrite directive in your \newcommand. If you do and use it a lot you will exhaust the write buffers available. Just move that command out of the \newcommand block. Like: \newwrite\dotfile \newcommand{\digraph}[4][scale=1]{ \immediate\openout\dotfile=#2.dot etc.

by Unregistered Visitor on 10/06/10

Updated version on Github

For an updated version of GraphViz.sty see Mike Prentice's Github version: https://github.com/mprentice/GraphViz-sty

by Mark Aufflick on 02/23/11

Filenames with hyphens

If you want filenames with hyphens in them, put quotes around #2 in the following line: \immediate\write\dotfile{digraph #2 {\string#3}}

by Unregistered Visitor on 04/02/13

Accents and labels with spaces

Very nice functionality! But how do you prevent PDFLaTeX from introducing strange codes when using spaces and accented characters in, e.g. label? Example: try the following \digraph[scale=0.5]{MyGraph}{rankdir=LR; a [label="This is A"]; a->b; b->c} If I drop the double quotes there will be three nodes instead of one, and any replacement of the quotes by single quotes or braces, will result in strange nodes labeled with LaTeX items from when it processes the box; just like when the label string contains accented characters. Solving this would, for my use, make graphviz.sty full featured. Best regards, Morten Lind.

by Unregistered Visitor on 06/27/13

Updated version on Github

I just uploaded a newer version of this to Github: https://github.com/drayside/graphviz.sty cheers, Derek.

by Unregistered Visitor on 08/15/13

Add comment