Рисование конечных автоматов и графов с помощью TikZ
Библиотека TikZ automata для теории автоматов
В курсах дискретной математики, теории компиляторов и теоретической информатики постоянной задачей является отрисовка детерминированных (ДКА) и недетерминированных (НКА) конечных автоматов, сетей Петри и графов переходов (в смежных задачах программирования также полезен навык создания блок-схем алгоритмов по ГОСТ).
Специализированная библиотека TikZ automata предоставляет готовые семантические примитивы: начальные состояния со стрелкой входа (initial), финальные допускающие состояния с двойной окружностью (accepting), а также петли и дуги переходов.
Подключение библиотек и базовые стили
В преамбуле документа подключите TikZ и расширения для позиционирования и автоматов:
\usepackage{tikz}
\usetikzlibrary{automata, positioning, arrows.meta}
Библиотека positioning позволяет размещать состояния фразами вида right=of q0 вместо ручного высчитывания сантиметров.
Конечный автомат latex онлайн: начальные и допускающие состояния
Ниже приведен готовый код, собирающий рабочий конечный автомат latex онлайн, распознающий бинарные цепочки с четным числом нулей (а иерархические структуры графов удобно строить через пакет синтаксических деревьев forest):
\begin{tikzpicture}[
shorten >=1pt,
node distance=3cm,
on grid,
auto,
every state/.style={thick, fill=blue!10}
]
% Состояния
\node[state, initial, accepting] (q_0) {$q_0$};
\node[state] (q_1) [right=of q_0] {$q_1$};
% Переходы
\path[-{Stealth}]
(q_0) edge [loop above] node {1} (q_0)
edge [bend left] node {0} (q_1)
(q_1) edge [loop above] node {1} (q_1)
edge [bend left] node {0} (q_0);
\end{tikzpicture}
Ключевые директивы:
state, initial— рисует состояние $q_0$ с входящей стартовой стрелкой слева.accepting— автоматически отрисовывает двойную концентрическую окружность допускающего состояния.bend left— изгибает ребро дугой, чтобы прямая и обратная стрелки между узлами не сливались.
Нарисовать граф в latex tikz automata: изогнутые ребра и петли
Если требуется нарисовать граф в latex tikz automata общего вида (взвешенный, ориентированный или неориентированный), используют стили весов на дугах:
\begin{tikzpicture}[node distance=2.5cm, main/.style = {draw, circle, thick, minimum size=8mm}]
\node[main] (1) {$v_1$};
\node[main] (2) [right=of 1] {$v_2$};
\node[main] (3) [below right=of 1] {$v_3$};
\path[->, >=stealth, thick]
(1) edge node[above] {$w=4$} (2)
(2) edge [bend right] node[right] {$w=2$} (3)
(3) edge node[below left] {$w=7$} (1)
(1) edge [loop left] node {$w=1$} (1);
\end{tikzpicture}
Опция loop left / loop above формирует аккуратную петлю перехода узла в самого себя.
Позиционирование узлов относительно друг друга
Советы для создания чистых схем:
- Используйте
node distance=2.5cm and 3cm, чтобы раздельно управлять горизонтальным и вертикальным шагом сетки. - Для русскоязычных надписей на стрелках используйте стандартные текстовые ноды:
node[midway, above] {сигнал}. - Цветные заливки состояний (
fill=green!20) помогают визуализировать текущее состояние алгоритма при пошаговом объяснении в презентациях.
Практические советы
Скрытие стартового текста "start"
По умолчанию над стрелкой входа пишется слово «start». Чтобы убрать его или заменить на русское «вход», добавьте параметр: initial text={вход} или initial text={}.
Толщина линий переходов
Для полиграфической четкости используйте глобальный модификатор стрелок -Latex[length=3mm, width=2mm].