朋友们,考虑以下代码:
\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
样式中,该样式将“状态”和“字符”中显示的文本作为两个参数。事实上,我们需要两个不同的pic
s,具体取决于“状态”和“字符”的相对位置。
定义带有两个参数的 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
您可以使用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 的路径在路径上方,因此使用密钥。q0
q1
below
left
right
above right
q1
q0
above
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
您可以沿着路径移动图钉,并且箭头也会跟随它。