如何使 TikZ 自动机接受节点与不接受节点的大小相同?

如何使 TikZ 自动机接受节点与不接受节点的大小相同?

我想使用 TikZ 自动机库来绘制有限自动机,其中无论状态是否接受,状态节点的大小都保持不变。

以下是演示该问题的 MWE。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{automata}

\tikzstyle{accepting}=[double distance=2pt, outer sep=1pt+\pgflinewidth]

\begin{document}
\begin{tikzpicture}
  \draw[help lines, step=.5cm] (0, 0) grid (4,2);
  \node[state] (q0) at (1,1) {};
  \node[state, accepting] (q1) at (3,1) {};
  \draw (q0) edge [bend left=15, ->] (q1);
\end{tikzpicture}
\end{document}

双节点自动机

您可以看到接受节点大于不接受节点。

我相信我明白为什么正在发生这种情况:double distance打开double,这会导致 TikZ 绘制两个具有不同颜色和不同宽度的圆圈,首先是宽度为 的黑色圆圈2pt+2\pgflinewidth,然后是宽度为 的白色圆圈2pt。这导致出现双线。

有没有办法可以修改 设置的样式,accepting使其inner sep适当减小节点(或 )的大小,从而使节点大小不变?或者,我是否可以accepting简单地以节点为中心绘制第二个圆圈?

答案1

当然,经过几天的努力之后,我在发布问题后不久就找到了解决方案。

我的解决方案使用calc库和path picture

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{automata, calc}

\tikzstyle{accepting}=[path picture={%
  \draw let 
    \p1 = (path picture bounding box.east),
    \p2 = (path picture bounding box.center)
    in
      (\p2) circle (\x1 - \x2 - 2pt);
  }]

\begin{document}
\begin{tikzpicture}
  \draw[help lines, step=.5cm] (0, 0) grid (4,2);
  \node[state] (q0) at (1,1) {};
  \node[state, accepting] (q1) at (3,1) {};
  \draw (q0) edge [bend left=15, ->] (q1);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容