这可以类似地表述为为什么刚创建的 TikZ 形状是“未知”?;但略有不同。以下是 MWE:
\documentclass[%
12pt,
journal,
onecolumn,
twoside,
draftcls,
letterpaper,
]{IEEEtran}
\usepackage{adjustbox}
\usepackage{setspace}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{shapes}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{positioning}
\usetikzlibrary{decorations}
\usetikzlibrary{decorations.markings}
\usetikzlibrary{decorations.pathreplacing}
\begin{document}
\singlespacing
\begin{adjustbox}{width=1.0\textwidth}% fbox,
\begin{tikzpicture}
\tikzstyle{bb} = [draw,line width=1pt]
\tikzstyle{brdec} = [thick, decoration={ brace, mirror, amplitude=8pt, raise=8pt }, decorate]%
\tikzstyle{brdecn} = [pos=0.5,anchor=north,yshift=-1.5em]%
\foreach \a/\b in {
0/t1,
1/t2,
2/t3,
3/t4,
4/t5,
5/t6,
6/t7,
7/t8
} {
\typeout{1st loop; name is: bn\a};
\node[bb] (bn\a) at (\a,0) {\b};
};
\foreach \a/\b/\c in {
0/x1/0,
2/x2/1,
4/x3/2,
6/x4/3
} {
\pgfmathtruncatemacro{\next}{\a+1} % returns int
\typeout{2nd loop; name is: brz\c};
\draw[brdec] (bn\a.south west) -- (bn\next.south east)
node[brdecn] (brz\c) {\b};
};
\foreach \a/\b/\c in {
0/0/z1,
2/1/z2
} {
\pgfmathtruncatemacro{\next}{\a+1} % returns int
\typeout{3rd loop; name is: brf\b};
\draw[brdec] (brz\a.south west) -- (brz\next.south east)
node[brdecn] (brf\b) {\c};
};
\end{tikzpicture}
\end{adjustbox}
\end{document}
输出pdflatex
如下:
...ABD: EveryShipout initializing macros
1st loop; name is: bn0
1st loop; name is: bn1
1st loop; name is: bn2
1st loop; name is: bn3
1st loop; name is: bn4
1st loop; name is: bn5
1st loop; name is: bn6
1st loop; name is: bn7
2nd loop; name is: brz0
2nd loop; name is: brz1
2nd loop; name is: brz2
2nd loop; name is: brz3
3rd loop; name is: brf0
3rd loop; name is: brf1
! Package pgf Error: No shape named brz3 is known.
See the pgf package documentation for explanation.
Type H <return> for immediate help.
...
l.63 }
;
请注意brz3
,实际上应该创建(并且输入显示问题不是浮点数,就像上面引用的问题的解决方案一样) - 并且引用其他节点没有问题; 事实上,如果我指示在出现pdflatex
此错误后继续,我会得到以下信息:
有人知道发生了什么事,以及如何解决这个问题?
编辑:非常感谢@alexwlchan,但是,如果我在前两个循环(7/t8,
和6/x4/3,
)后添加逗号,我会得到这个:
在第三个循环 ( ) 中添加逗号2/1/z2,
会添加一个额外的旋转括号。我认为添加一个逗号tikz
会再运行一次循环迭代,但参数为空,从而导致出现额外的错误括号。有什么办法可以解决这个问题吗?
答案1
\foreach
问题出现在循环中案例列表的末尾
\foreach \a/\b/\c in {
0/x1/0,
2/x2/1,
4/x3/2,
6/x4/3
}
当读取时6/x4/3
,后面没有逗号或右括号,因此它在定义中包含了空格\c
。
这意味着您将获得一个名为的节点brz3 (+ some other stuff)
。比我更了解 TikZ 的人可以准确地告诉您这是什么,但这并不重要。
这意味着当 TikZ 查找名为 的节点时brz3
,它与您创建的节点不匹配。您应该在列表末尾添加一个尾随逗号,然后它只会读取单个字符3
。
正如 sdaau 指出的那样,这会在循环中创建一个空条目,并弄乱括号。相反,您应该将右括号向上移动,这样 for 的条目3
就只有一个字符,这样循环就结束了。
这与您的其余节点匹配,并且名称匹配:
\foreach \a/\b/\c in {
0/x1/0,
2/x2/1,
4/x3/2,
6/x4/3}
{
% some code here
}
您还需要在设置节点的第一个循环中添加尾随逗号bn
并移动右括号,否则您会收到类似的错误,原因相同。