我正在制作一个自动机的图片,其中转换具有逗号分隔的权重元组。这不是问题,直到我尝试使用 for 循环语法将转换分隔在图的同一部分中(感谢:如何绘制上面的多边循环 - tikz)。因为 for 循环的边标签是用逗号分隔的,所以循环会将元组中的每个元素抓取为新标签的一部分,而不是标签的一部分。
\documentclass{article}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\begin{document}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\node[initial,state, accepting, align = center] (A) {0};
\path (A) edge [loop above, align=center] node {a:a \\ $\langle 0, 0, 0, 0 \rangle$} (A);
\begin{pgfinterruptboundingbox}
\foreach \looseness/\label [count=\n] in {15/i:a \\ $\langle 2 1 1 1\rangle$ }
\path [->] (A) edge [
loop above, align = center,
every loop/.append style={
looseness=\looseness,
in=60-0.8*\looseness,
out=120+0.8*\looseness
}] node {\label} ();
\end{pgfinterruptboundingbox}
\end{tikzpicture}
\end{document}
为了避免这种情况,我省略了逗号。结果是手动指定的弧看起来符合我的要求,但 for 循环创建的弧却不符合我的要求(元素之间没有逗号)。我得到的印象是在 tikz 中使用双重 for 循环for 循环不支持我想要做的事情,但我想确定一下。
PS 我制作的图确实使用了几个弧,因此有理由使用 for 循环。
答案1
在 TikZ 中,在循环中使用包含逗号的值的通常方法\foreach
是使用花括号保护它们。(请注意,坐标可以特殊处理,因此不要对此使用此方法。)
例如:
\documentclass[tikz, border=50pt]{standalone}
\usetikzlibrary{arrows,automata}
\begin{document}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\node[initial,state, accepting, align = center] (A) {0};
\path (A) edge [loop above, align=center] node {a:a \\ $\langle 0, 0, 0, 0 \rangle$} (A);
\begin{pgfinterruptboundingbox}
\foreach \looseness/\label [count=\n] in {12/i:a \\ {$\langle 2, 1, 1, 1\rangle$} }
\path [->] (A) edge [
loop above, align = center,
every loop/.append style={
looseness=\looseness,
in=60-.8*\looseness,
out=120+.8*\looseness
}] node {\label} ();
\end{pgfinterruptboundingbox}
\end{tikzpicture}
\end{document}