对于刚创建的 foreach 节点,没有形状可言

对于刚创建的 foreach 节点,没有形状可言

这可以类似地表述为为什么刚创建的 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此错误后继续,我会得到以下信息:

测试31.png

有人知道发生了什么事,以及如何解决这个问题?


编辑:非常感谢@alexwlchan,但是,如果我在前两个循环(7/t8,6/x4/3,)后添加逗号,我会得到这个:

测试32.png

在第三个循环 ( ) 中添加逗号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并移动右括号,否则您会收到类似的错误,原因相同。

相关内容