\foreach 循环中 \path 坐标的奇怪行为

\foreach 循环中 \path 坐标的奇怪行为

对我来说(使用 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}

相关内容