在 TikZ foreach 循环中命名路径

在 TikZ foreach 循环中命名路径

是否可以在 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密钥。这样可以使路径名始终可用(好吧,对于整个画面而言)。于是,它就起作用了。

上述操作的结果如下:

替代文本

相关内容