TikZ:在 \foreach 中命名路径并稍后访问它们

TikZ:在 \foreach 中命名路径并稍后访问它们
\documentclass[convert = false, tikz]{standalone}
\usetikzlibrary{calc}
\usetikzlibrary{intersections}

\begin{document}
\begin{tikzpicture}
  \coordinate (P1) at (60:4cm);
  \coordinate (P2) at (-20:4cm);

  \def\rad{1}

  \draw[name path global = line] (0, 0) -- (P1);

  \foreach \pos/\i in {(P1)/1, (P2)/2}{
    \draw[name path global = circ\i] \pos circle[radius = \rad];
  }

  \node[coordinate, name intersections = {of = line and circ1}] (P) at
  ($(intersection-1)$) {};
\end{tikzpicture}
\end{document}

有人告诉我LaTeX不知道名称\circ1,也许我拼错了。如何访问命名路径以进行交叉点计算?

答案1

问题似乎是 和 周围的括号P1使P2解析器无法foreach正常工作:\i包含(P1)(P2),而不是12。您可以通过删除括号来解决这个问题:

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{intersections}

\begin{document}
\begin{tikzpicture}
  \coordinate (P1) at (60:4cm);
  \coordinate (P2) at (-20:4cm);

  \def\rad{1}

  \draw[name path global = line] (0, 0) -- (P1);

  \foreach \pos/\i in  {P1/1, P1/2}{
    \draw[name path global = circ\i] (\pos) circle[radius = \rad];
    \node[coordinate, name intersections = {of = line and circ\i}] (P) at
  (intersection-1) {};
  }


\end{tikzpicture}
\end{document}

编辑:

在仅需找到线与的交点的情况下circ2,我们可以将节点移出\foreach命令,并合并 Qrrbrbrilbel 关于使用 的注释/.expanded

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{intersections}

\begin{document}
\begin{tikzpicture}
  \coordinate (P1) at (60:4cm);
  \coordinate (P2) at (-20:4cm);

  \def\rad{1}

  \draw[name path global = line] (0, 0) -- (P1);

  \foreach \pos/\i in  {P1/1, P1/2}{
    \draw[name path global/.expanded = circ\i] (\pos) circle[radius = \rad];
  }

  \node[coordinate, name intersections = {of = line and circ1}] (P) at
  (intersection-1) {};

\end{tikzpicture}
\end{document}

答案2

您可以使用()循环遍历坐标而不保护,(在笛卡尔坐标中),您可以说

\foreach \pos in {(0,0), (0,1), (1,0), (1,1)}
   \fill \pos circle [radius=.5];

它不会将列表分成八个(、、、(0等)元素,而是分成四个。0)(01)

那么这样写可能更自然

\foreach \pos in {{(0,0)}, {(0,1)}, {(1,0)}, {(1,1)}}
   \fill \pos circle [radius=.5];

甚至更糟

\foreach \x/\y in {0/0, 0/1, 1/0, 1/1}
   \fill (\x,\y) circle [radius=.5];

这也会妨碍使用除笛卡尔坐标之外的任何其他坐标(您不能输入极坐标或命名节点或...)。

已经定义的坐标也会发生同样的事情。但问题是,\foreach只在列表中元素的开头接受它还会丢弃其后的所有其他内容)(使列表中的每个其他变量/默认为扫描的坐标)。

我不知道为什么要这样实现,但可以(至少在这个例子中)通过发出以下命令来“修复”这个问题

\makeatletter
\def\pgffor@scanround(#1)#2,{\def\pgffor@value{(#1)#2}\pgffor@scanned}
\makeatother

在序言中。

(当然,你可以用不同的方式来编写循环,比如

\foreach \i in {1, 2}
  \draw[name path global/.expanded = circ\i] (P\i) circle[radius = \rad];

但这不是这个问题的重点。)

/.expanded但是,仍然需要处理程序。

代码

\documentclass[convert = false, tikz]{standalone}
\usetikzlibrary{intersections}
\makeatletter
\def\pgffor@scanround(#1)#2,{\def\pgffor@value{(#1)#2}\pgffor@scanned}
\makeatother
\begin{document}
\begin{tikzpicture}
  \coordinate (P1) at (60:4cm);
  \coordinate (P2) at (-20:4cm);

  \def\rad{1}

  \draw[name path global = line] (0, 0) -- (P1);

  \foreach \pos/\i in {(P1)/1, (P2)/2}
    \draw[name path global/.expanded = circ\i] \pos circle[radius = \rad];

  \node[coordinate, name intersections = {of = line and circ1}] (P) at  (intersection-1) {};
\end{tikzpicture}
\end{document}

相关内容