\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)
,而不是1
和2
。您可以通过删除括号来解决这个问题:
\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)
(0
1)
那么这样写可能更自然
\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}