我非常想定义一个如下所示的 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}