fixedpoint.jp


Graphviz in LaTeX (2007-08-14)

Graphviz はノードの2項関係からグラフを生成するために便利なツールです。このグラフは eps 形式でも出力することができるので、LaTeX のソース(マニュスクリプト)に図を埋め込むために使えます。

今回さらに便利にするために、そもそも dot 言語によるノード関係の記述をマニュスクリプトに埋め込んでみます。これは graphviz.tex として紹介されているマクロで実現できます。

しかし、このマクロでは .dot ファイルを出力することまでは出来ますが、指摘されているように .eps ファイルの生成までは面倒をみてくれません。そこで、TeX からシェルコマンドを実行させることで直接図の埋め込みまで行うように改変しました:

\newcommand{\digraph}[3][scale=1]{
  \newwrite\dotfile
  \immediate\openout\dotfile=#2.dot
  \immediate\write\dotfile{digraph #2 {\string#3}}
  \immediate\closeout\dotfile
  \immediate\write18{dot -Tps -o #2.ps #2.dot}
  \IfFileExists{#2.ps}
      % the postscript exists: include it
      { \includegraphics[#1]{#2} }
      % the postscript doesn't exist: tell the user how to create it
      { \fbox{ \begin{tabular}{l}
          The file \texttt{#2.ps} hasn't been created from
          \texttt{#2.dot} yet. \\
          Run `\texttt{dot -Tps -o #2.ps #2.dot}' to create it. \\
          Here is a \textsf{bash} loop to process all \textsf{dot} files
          in the current directory: \\
          \texttt{
          for f in *.dot do ;
          dot -Tps -o \$\{f\%dot\}ps \$f ;
          done
          }
          \end{tabular}}
      }
}

(graphviz.tex)

使用例:

\documentclass[a4paper]{article}
\usepackage[dvips]{graphicx}
%\usepackage[dvipdfmx]{graphicx}
\input{graphviz}
\begin{document}
\digraph[scale=0.5]{YourGraph}{rankdir=LR; a->b; b->c}
\end{document}

(example.tex)

ただし \write18 を含むマニュスクリプトをコンパイルすることは一般に制限されているので、"-shell-escape" または "--enable-write18" などをつけて tex を呼び出す必要があります。

$ latex -shell-escape example.tex

© 2006-2023 fixedpoint.jp