TikZ:我可以获得 foreach 的任意列表格式吗?

TikZ:我可以获得 foreach 的任意列表格式吗?

我非常想定义一个如下所示的 foreach 循环:

\foreach \pointA-\pointB in {(1,0)-(2,2),(3,4)-(2,1)}{
    \draw \pointA -- \pointB
}

这样每对点之间就会画出线。

我可以\foreach接受这种输入吗?或者还有其他方法吗?我将定义一个宏来快速在两个点之间画线。

我知道我可以使用/而不是-但是那样的话我还必须将坐标包装在 中{ },这需要大量工作。

答案1

您可以使用 / 代替 -。您还需要将坐标换行{}(请参阅马丁的这个回答如果你想知道为什么),那么你的例子将会变成:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \pointA/\pointB in {{(1,0)}/{(2,2)},{(3,4)}/{(2,1)}}{
  \draw \pointA -- \pointB;
}
\end{tikzpicture}
\end{document}

这也可以扩展到超过 2 个元素,只需添加另一个/ \pointC。所有这些都在Tikz 手册

编辑 好的,经过你的修改(最好指定这一点,否则 Peter 和我看起来很傻;)),我的答案就不再那么好了。基本上,由于与我上面提到的评论相同的原因,你不能做你想做的事情。不过你可以解决这个问题。注意:这只是一些快速拼凑起来的东西,它可能无法很好地处理所有事情,但它可以处理你的 MWE,并且可以扩展。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcounter{n}
\makeatletter
\def\wrap(#1)#2{%
    \stepcounter{n}%
    \coordinate (\number\value{n}) at (#1);%
    \if#2(%
        \wraprest#2%
    \else\fi%
}
\def\wraprest(#1)#2{%
    \stepcounter{n}%
    \coordinate (\number\value{n}) at (#1);%
    \if#2(% 
        \wrap#2%
    \else\fi%
}
\begin{document}
\begin{tikzpicture}
\wrap(1,0)(2,0)(3,0)(4,0)(5,0)(6,0)(7,0)(8,0)x%
\foreach \pointA in {1,3,...,\number\value{n}}{
    \pgfmathsetmacro{\pointB}{\pointA+1}
  \draw (\pointA) -- (\pointB);
}
\end{tikzpicture}
\makeatother
\end{document}

这使用了 Peter 定义坐标并使用列表中的坐标的方法。首先为每个坐标创建一个坐标,(x,y)并对这些坐标进行编号,这样线从n到奇数n+1处延伸n。如果您想要对之间的分隔符,可以稍微修改一下添加这些分隔符。(x末尾的wrap可以是任何东西,但不能是()。

答案2

你可以,但是你必须将每个坐标包装在中,{}因为\foreach使用来,分隔参数:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \pointA/\pointB in {{(1,0)}/{(2,2)},{(3,4)}/{(2,1)}}{
    \draw \pointA -- \pointB;
}
\end{tikzpicture}
\end{document}

不过,我通常倾向于先用名称定义坐标,然后使用:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (1,0);
\coordinate (B) at (2,2);
\coordinate (C) at (3,4);
\coordinate (D) at (2,1);

\foreach \pointA/\pointB in {A/B, C/D}{
    \draw (\pointA) -- (\pointB);
}
\end{tikzpicture}
\end{document}

相关内容