読者です 読者をやめる 読者になる 読者になる

cloverrose's blog

Python, Machine learning, Emacs, CI/CD, Webアプリなど

dot2texiを使う

dot2texiとはdot2texをより便利にしたもの。
dot2tex=Graphviz+TeX=ノードとか辺のラベルにp_1とかTeXのように記述することができる。
dot2texi=dot2texをTeX処理系が自動で呼び出しすことで、ユーザーはtexソースに直接Graphvizのグラフを書くことができる。
詳しくは公式ドキュメント。

dot2texのインストール(パッチを当てる必要がある)

公式 1. Installation guide — dot2tex v2.9.0dev documentation

依存ライブラリのインストール

Graphviz本体も別途入れる。
MacTeXではtex系の依存パッケージはもともと入っていた。

pip install pyparsing
pip install pydot
pip install pygraphviz

dot2texのインストール

dot2texはPyPIからダウンロードできない。
Downloads - dot2tex - Convert graphs generated by Graphviz to LaTeX friendly formats - Google Project Hostingから2.8.7をダウンロードする。
解凍して、#725066 - dot2tex: failed import of _noncomma with pyparsing 2.0.1 (patch included) - Debian Bug report logsを参考に、_noncommaを削除する。

インストール

python setup.py install

dot2texiを使う

公式 http://get-software.net/macros/latex/contrib/dot2texi/dot2texi.pdf

hoge.tex

\documentclass{article}
\usepackage{dot2texi}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

\begin{document}
\begin{dot2tex}[neato, mathmode]
digraph G{
 node [shape="circle"];
 a_1 -> a_2 -> a_3 -> a_4 -> a_1;
}
\end{dot2tex}
\end{document}


dot2texiの仕組みとして、texの処理系から外部コマンドのdot2texを呼び出すことになる。
これはセキュリティの観点から通常はできないようにしている。
次のようにオプションで外部コマンドの呼び出しを許可する。

platex --enable-write18 hoge.tex
dvipdfmx hoge.dvi

ただ、自分の環境だとエラーは出ないけど、正しく描画されない。

pdflatexだとうまくいきました。(pdflatexは既存のソースとうまく合わせられないので、グラフ作る部分は別ソースにしてとりあえず)

pdflatex --shell-escape hoge.tex

\documentclass{article}
\usepackage{dot2texi}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

\begin{document}
\begin{dot2tex}[neato, mathmode]
strict digraph {
  node [style=filled, fontcolor=black, fillcolor=white];
  edge [color=black, label="\N"];
  q10 [texlbl="$(q_1, 0)$", pos="0,2!"];
  q20 [texlbl="$(q_2, 0)$", shape=box, pos="2,2!"];
  q10q31 [texlbl="$(q_1, 0), (q_3, 1)$", pos="2, 1!", color=red];
  q20q41 [texlbl="$(q_2, 0), (q_4, 1)$", shape=box, pos="2, 0!"];
  q10q32 [texlbl="$(q_1, 0), (q_3, {\bf{\color{red}2}})$", pos="0, 1!"];
  q20q42 [texlbl="$(q_2, 0), (q_4, {\bf{\color{red}2}})$", shape=box, pos="0, 0!"];
  q10 -> q20 [texlbl="$g, \neg g$"];
  q20 -> q10 [texlbl="$\neg r$"];
  q20 -> q10q31 [texlbl="$r$"];
  q10q31 -> q20 [texlbl="${\bf{\color{red}g}}$", color=red];
  q10q31 -> q20q41 [texlbl="$\neg g$"];
  q20q41 -> q10q32 [texlbl="$r,\neg r$"];
  q10q32 -> q20 [texlbl="$g$"];
  q10q32 -> q20q42 [texlbl="$\neg g$"];
  q20q42 -> q10q32 [texlbl="$r, \neg r$"];
}
\end{dot2tex}
\end{document}