Graphviz для TeX в среде Windows

Graphviz - пакет программ для создания изображений графов, диаграмм и т.п. Изображение кодируется в виде программы, написанной на языке DOT, которая с помощью интерпретаторов преобразуется в изображения различного формата.

Ниже изложен опыт установки пакета в Windows (7, Русская, x64), создание рисунков диаграмм с использованием русского языка и их вставка в TeX-документ. Во всех случаях стремимся работать с русским языком в юникоде.

Установка в Windows

Дистрибутивы и информация о пакете - http://www.graphviz.org

Ни стабильная (2.28 на момент написания этого текста), ни экспериментальная (2.29) версии «из коробки» не заработали, сославшись на отсутствие graph.dll (его действительно не было).
Архив стабильных версий доступен по адресу: http://www.graphviz.org/pub/graphviz/stable/windows/
Версия 2.26.3, выбранная наугад, встала и заработала без проблем. Установилась она в каталог c:\Program Files (x86)\Graphviz2.26.3\. При установке добавила себя в путь поиска (PATH): path= ... C:\Program Files (x86)\Graphviz2.26.3\bin

Дистрибутив лежит здесь: http://www.graphviz.org/pub/graphviz/stable/windows/graphviz-2.26.3.msi

Поскольку пакет предполагает использование командной строки, желательно иметь установленные оболочки типа Total Commander или FAR. Кроме того мы будем использовать файлы в формате Postscript (PS), для работы с которыми понадобятся пакеты Ghostscript и GSView. Найти их можно здесь: http://www.ghostscript.com.

Первый запуск

Любым редактором создаём файл с расширением .gv (например test.gv). Содержимое файла составляет программу на языке DOT, порождающую направленный граф:
digraph test {
1->2;
1->3;
}
Для получения PS файла из этой программы на языке DOT набираем в командной строке:
dot -Tps -o test.ps test.gv
В результате в текущем каталоге появится файл test.ps, который можно посмотреть программой GSView.

Для получения результата в виде растрового изображения, в формате, например JPG, набираем в командной строке:
dot -Tjpg -o test.jpg test.gv
В результате получим файл test.jpg с нашей диаграммой размером 179 на 165 точек. Если необходимо увеличить количество точек рисунка нужно внести изменения в файл test.gv:
digraph test {
dpi="600";
1->2;
1->3;
}
Полученный файл изображения будет теперь иметь размер 1117 на 1033 точки.

Русские буквы

Для работы с русским языком необходимо файл test.gv сохранить в кодировке UTF-8 без BOM (win 65001). Сделать это можно, например, с помощью редактора AkelPad. Модифицируем тестовый файл:
digraph test {
charset="utf8";
node [fontname="Verdana", fontsize=10, fontcolor="red"];
1->Проверка;
1->"Пример\nиспользования";
}
и сохраняем в кодировке UTF-8 без BOM. Конвертируем:
dot -Tps:cairo -o test.ps test.gv
или
dot -Tjpg -o test.jpg test.gv
и видим русские буквы.
При получении PS файла был использован фильтр (библиотека) cairo.

Шрифты, метки

Шрифты устанавливаются отдельно для вершины (node) и ребра (edge) графа. Причём их можно установить для всех объектов или для конкретной вершины или ребра:
digraph test {
charset="utf8";
node [fontname="Verdana", fontsize=10, fontcolor="red"];
Проверка [fontname="Arial Italic", fontcolor="blue"];
1->Проверка;
1->"Пример\nиспользования";
node [shape=box] /*Комментарий: DOT является интерпретатором. Эта команда
действует на все строки, расположенные ниже*/
1->3;
//Однострочный комментарий
}
Атрибуты всех вершин устанавливаются командой node в 3-й строке, а атрибуты вершины «проверка» - командой в 4-й строке. DOT является интерпретатором. Команда в 7-й строке действует только на команду в 8-й строке.

По умолчанию меткой вершины является её название, а метка ребра отсутствует. Ниже показано как изменить метки и назначить для них шрифты.
digraph test {
charset="utf8";
node [fontname="Verdana", fontsize=10, fontcolor="red"];
edge [fontname="Times New Roman", fontsize=10, fontcolor="dodgerblue"];
smpl [label="Пример\nиспользования", fontname="Arial Italic", fontcolor="blue"];
1->Проверка [label=авария];
1->smpl;
1->3 [label=повтор, fontcolor="black"];
}
Команда node устанавливает атрибуты всех вершин, команда edge устанавливает атрибуты всех рёбер. Команда в 5-й строке меняет метку вершины smpl и шрифт для её написания. В шестой строке меняется метка ребра с сохранением шрифта Times New Roman. В 8-й строке меняется метка ребра с сохранением шрифта Times New Roman, и изменением цвета.

Вставляем PS-картинку в TeX

Рисунки для вставки готовим в формате PDF. Их можно использовать в pdflatex и xelatex. Основной проблемой при подготовке в Graphviz рисунка для вставки в TeX является получение картинки, обрезанной по её размерам (bounding box), а не размещённой на странице документа размером A4.

Приводимый ниже пример показывает как задать размер рисунка и масштабировать рисунок под выбранный размер.
digraph finite_state_machine {
	ratio="auto";
	size="2,2";
	edge [fontname="Times New Roman", fontsize=12, fontcolor="blue"];
	node [fontname="Verdana", fontsize=10, fontcolor="red"];
	node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
	node [shape = circle];
	charset="utf8";
	rankdir="TB";
	LR_0 -> LR_2 [ label = "SS(B)" ];
	LR_0 -> LR_1 [ label = "SS(S)" ];
	LR_1 -> LR_3 [ label = "S($end)" ];
	LR_2 -> LR_6 [ label = "SS(b)" ];
	LR_2 -> LR_5 [ label = "SS(a)" ];
	LR_2 -> LR_4 [ label = "S(A)" ];
	LR_5 -> LR_7 [ label = "S(b)" ];
	LR_5 -> LR_5 [ label = "S(a)" ];
	LR_6 -> LR_6 [ label = "S(b)" ];
	LR_6 -> LR_5 [ label = "S(a)" ];
	LR_7 -> LR_8 [ label = "S(b)" ];
	LR_7 -> LR_5 [ label = "S(a)" ];
	LR_8 -> LR_6 [ label = "S(b)" ];
	LR_8 -> LR_5 [ label = "S(a)" ];
}
Рисунок, в обычном состоянии занимающий почти страницу формата A4, командами во второй и третьей строках масштабируется до размеров 2in на 2in. Команда size понимает только дюймы, команда ratio масштабирует с сохранением пропорций.
Преобразуем PS в EPS программой GSView: Файл|PS в EPS|помечаем «автоматически вычислять габариты» и отвечаем утвердительно на вопрос читали ли мы справку|указываем имя файла с расширением (eps).
Для преобразования EPS в PDF используем программу eps2pdf которая находится по адресу: http://lab.fs.uni-lj.si/ladisk/?what=incfl&flnm=latex.php (автор - Nikola Jaksic). Полученный PDF файл имеет размеры 2,79 на 5,15 см.

Как его включить в документ, показано ниже, в минимальном примере для xelatex.
% !TEX encoding = UTF-8
% !TEX program = XeLaTeX
% !TeX spellcheck = ru_RU_yo
\documentclass[12pt]{article}
\usepackage{fontspec, graphicx, polyglossia}
\setdefaultlanguage{russian} 
\setotherlanguage{english}
\setmainfont{Arial}
\begin{document}
\includegraphics{test}
\end{document}

Дополнительная информация

Может быть получена по адресам:
http://www.graphviz.org
http://lib.custis.ru/Graphviz
http://wingraphviz.sourceforge.net/wingraphviz/
Подробности о библиотеке Cairo: http://www.cairographics.org/

Документация:
dot user guide (PDF): http://graphviz.org/Documentation/dotguide.pdf
neato user guide (PDF): http://graphviz.org/Documentation/neatoguide.pdf

Примеры рисунков:
http://www.graphviz.org/Gallery.php
http://www.flickr.com/photos/kentbye/sets/72157601523153827/




Контакты

На первой странице сайта.
Д. Морозов