是否可以在 foreach 循环内创建命名路径,其名称取决于计数器?
我想写一些类似的东西
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\foreach \i in {1,2,...,6}
\draw[name path=line\i] (-3,-\i) -- (3,\i);
\draw[name intersections={of=line1 and line2}] (intersection-1) circle (5pt);
\end{tikzpicture}
\end{document}
但这会引发以下错误:
! Missing \endcsname inserted.
<to be read again>
\OT1\i
l.11 \draw (0,3) circle (3);
这是错误还是我做错了?我应该怎么做?
答案1
它也可能不那么黑客化。(pgf-manual 第 496 页)看一下这个修改后的代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\foreach \i in {1,2,...,6}
{
\draw[name path global/.expanded=line\i] (-3,\i) -- (3,-\i);
}
\draw[name intersections={of=line1 and line2}] (intersection-1) circle (5pt);
\end{tikzpicture}
\end{document}
答案2
我发现,当将选项作为宏传递给 TikZ 元素时,我需要在传递宏之前先扩展它:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\foreach \i in {1,2,...,6}
{
\edef\optname{name path global=line\i}
\expandafter\draw\expandafter[\optname] (-3,\i) -- (3,-\i);
}
\draw[name intersections={of=line1 and line2}] (intersection-1) circle (5pt);
\end{tikzpicture}
\end{document}
现在我已经查过了路径命名的作用,我注意到第一个版本不会起作用,因为路径命名发生在 foreach 循环中,而这是一个本地范围。因此路径名称不会保留到“外部”。即使只有\foreach
一行(因此没有花括号),情况也是如此。要验证这一点,只需执行以下操作:
\foreach \i in {1}
\draw[name path=line] (3,1) -- (-3,-1);
然后尝试引用该line
路径。TikZ 将会报错。
解决方案是改用name path global
密钥。这样可以使路径名始终可用(好吧,对于整个画面而言)。于是,它就起作用了。
上述操作的结果如下: