在自动机的路径上添加第二个标签

在自动机的路径上添加第二个标签

朋友们,考虑以下代码:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{automata}
\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}[shorten >=1pt,,node distance=4cm,on grid,auto, /tikz/initial text={start}]
\node[state, initial, accepting] (q0) {0};
\node[state] (q1) [right=of q0] {1};
\path[->] (q0) edge [bend left] node {on} (q1)
           (q1) edge [bend left] node {off} (q0)
;
\end{tikzpicture}

\end{document}

此代码产生以下输出:

自动机

我想这很简单。:)我想知道是否可以为每条路径添加第二个标签,这样我就不需要计算它们的坐标并将它们硬编码到图片中。我对第二个标签的想法是将文本放在主标签的相反方向。:)

作为奖励,我想知道让第二个标签与第一个标签略有不同会有多大挑战,比如像这个 gimp 图像:

第二张图片

有什么提示可以实现这一点吗?:)如果可以有第二个标签,即使没有这些花哨的功能,我也已经很高兴了。

答案1

这是另一个想法,使用pic(需要 PGF 3.0.0)

绘制“状态”(开/关)、附加字符(a)和小箭头的代码都封装在一个pic样式中,该样式将“状态”和“字符”中显示的文本作为两个参数。事实上,我们需要两个不同的pics,具体取决于“状态”和“字符”的相对位置。

定义带有两个参数的 pics 比定义带有单个参数的 pics 要稍微复杂一些,因为快捷方式foo/.pic只允许使用单个参数。因此我们必须使用“低级” pics/foo/.style,但它仍然非常简单:

\tikzset{
  pics/second label below/.style 2 args = {
   code = {
    \node[above] (-status) {#1};
    \node[below=3mm, inner sep=1pt] (-char) {\small #2};
    \draw[->] (0,0) -- (-char);
    }
  },
  pics/second label above/.style 2 args = {
   code = {
    \node[below] (-status) {#1};
    \node[above=3mm, inner sep=1pt] (-char) {\small #2};
    \draw[->] (0,0) -- (-char);
    }
  }
}

这张图片可以这样使用:

\begin{tikzpicture}[shorten >=1pt,,node distance=4cm,on grid,auto, /tikz/initial text={start}]
\node[state, initial, accepting] (q0) {0};
\node[state] (q1) [right=of q0] {1};
\path[->] (q0) edge [bend left] pic {second label below={on}{a}} (q1)
           (q1) edge [bend left] pic {second label above={off}{a}} (q0)
;
\end{tikzpicture}

并产生:

结果

作为奖励,它可以在曲线的其他位置使用,并且也能起作用:

\begin{tikzpicture}[shorten >=1pt,,node distance=4cm,on grid,auto, /tikz/initial text={start}]
\node[state, initial, accepting] (q0) {0};
\node[state] (q1) [right=of q0] {1};
\path[->] (q0) edge [bend left] pic[pos=0.8] {second label below={on}{a}} (q1)
           (q1) edge [bend left] pic[pos=0.8] {second label above={off}{a}} (q0)
;
\end{tikzpicture}

结果 2

答案2

您可以使用swap或简写'将第二个标签放在第一个标签的相反方向:

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

\begin{document}

\begin{tikzpicture}[shorten >=1pt,,node distance=4cm,on grid,auto, /tikz/initial text={start}]
\node[state, initial, accepting] (q0) {0};
\node[state] (q1) [right=of q0] {1};
\path[->] (q0) edge [bend left] node {on} node [swap] {a} (q1)
          (q1) edge [bend left] node {off} node [swap] {a} (q0)
;
\end{tikzpicture}

\end{document}

在此处输入图片描述

也许你可以放大outer sep来移动第二个节点:

\begin{tikzpicture}[shorten >=1pt,,node distance=4cm,on grid,auto, /tikz/initial text={start},
    secn/.style={swap,outer sep=5pt}
]
\node[state, initial, accepting] (q0) {0};
\node[state] (q1) [right=of q0] {1};
\path[->] (q0) edge [bend left] node {on}node[secn]{a} (q1)
          (q1) edge [bend left] node {off}node[secn]{a} (q0)
;
\end{tikzpicture}

在此处输入图片描述

答案3

另一种选择是使用label distance=xxcm和,如下所示。在从到 的below/above:text方向上,标签 a 分配在路径下方,因此使用密钥,实际上,、和更多也可以是一种选择。利用相同的思想,从到标签 a 的路径在路径上方,因此使用密钥。q0q1belowleftrightabove rightq1q0above

node[label={[label distance=0.5cm] below:a}] 

在此处输入图片描述

代码

\documentclass[border=10pt]{standalone}%{article}

\usepackage{tikz}
\usetikzlibrary{automata}
\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}[shorten >=1pt,,node distance=4cm,on grid,auto, /tikz/initial text={start}]
\node[state, initial, accepting] (q0) {0};
\node[state] (q1) [right=of q0] {1};
\path[->] (q0) edge [bend left] 
node[label={[label distance=0.5cm] below:a}] {on} (q1)
          (q1) edge [bend left] 
node[label={[label distance=0.5cm] above:a}] {off} (q0)
;
\end{tikzpicture}

\end{document}

答案4

只需进行最少的修改,即可使用pin选项

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{automata}
\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}[shorten >=1pt,,node distance=4cm,on grid,auto, /tikz/initial text={start},
pin edge={bend left=0,black, thick},
pin distance=3mm,
every pin/.style={font=\small, inner sep=1pt},
point/.style={inner sep=0, outer sep=0, minimum size=0}
]
\node[state, initial, accepting] (q0) {0};
\node[state] (q1) [right=of q0] {1};
\path[->] (q0) edge [bend left] node[pos=.3] {on} node[point,pin=below:a,pos=.2] {} (q1)
           (q1) edge [bend left] node {off} node[point,pin=above:b] {} (q0)
;
\end{tikzpicture}

\end{document}

如果您改变的值,pos您可以沿着路径移动图钉,并且箭头也会跟随它。

预览

相关内容