![\foreach 循环中 \path 坐标的奇怪行为](https://linux22.com/image/378044/%5Cforeach%20%E5%BE%AA%E7%8E%AF%E4%B8%AD%20%5Cpath%20%E5%9D%90%E6%A0%87%E7%9A%84%E5%A5%87%E6%80%AA%E8%A1%8C%E4%B8%BA.png)
对我来说(使用 pdflatex:pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016))以下代码可以很好地编译,但如果我取消注释第二个循环,它就会编译失败,并出现“放弃此路径...”错误消息。我是不是在做蠢事?
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\path coordinate (P) at (7,10);
\end{tikzpicture}
\begin{tikzpicture}
\foreach \position [count=\posi] in {(0,0), (3,0), (4,1), (5,2), (4,4), (2,5), (1,3)}
\path \position coordinate (P\posi);
\end{tikzpicture}
% \begin{tikzpicture}
% \foreach \position [count=\posi] in {(0,0), (3,0), (4,1), (5,2), (4,4), (2,5), (1,3)}
% \path coordinate (P\posi) at \position;
% \end{tikzpicture}
\end{document}
答案1
问题是,你必须按照手册中的说明at
使用(
\path ... coordinate[<options>](<name>)at(<coordinate>) ...;
这就是为什么\path coordinate (P\posi) at \position;
不起作用,但是\path \position coordinate (P\posi);
没问题。
编辑:正如 @marmot 在他的评论中提到的那样,问题在于当 tikz 在解析之后\position
时不会展开。(
at
如果你真的想使用at
,我不知道为什么有人会这样做,你不能说... at ([shift=\position]0,0) ...
强制扩展\position
,但在这种情况下如果你的\position
是一个命名坐标,它就会停止。
答案2
不,你没有做任何愚蠢的事情。类似的扩展问题已经报告这里。无论如何,你已经为自己找到了一个不错的出路。或者,你可以按照这个问题的答案之一去做。
旧答案:感谢@Zarko:最简单的解决方案:更新您的 TeX 发行版。
如果您不想这样做(或不能这样做),则需要将坐标放在括号中,因为它们包含逗号,这也是列表中的分隔符\foreach
。如果不使用括号,旧版本pgffor
会将第一个条目解释为(0
,这显然会导致错误。在列表中包含更复杂项目的新版本中也会出现同样的问题。一般来说,我认为括号不会造成任何问题。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{center}
\begin{tikzpicture}
\foreach \position [count=\posi] in {{(0,0)}, {(3,0)},
{(4,1)}, {(5,2)}, {(4,4)}, {(2,5)}, {(1,3)}}
{
\path \position coordinate (P\posi);
% \coordinate (P\posi) at \position;
}
\end{tikzpicture}
\end{center}
\end{document}