在这个答案我看到我们可以使用[<new pgf key>/.code={...}, <new pgf key>]
一些代码偷偷插入到 TikZ 路径的构造中。如果所有坐标都有标签,则此方法有效,因为标准数组是用逗号分隔的。我在想,listofitems
可以通过更改分隔符来使用该包处理没有标签的坐标列表。但是,下面的代码在路径构造期间会引发错误,我不太明白为什么。
折线只是在 MWE 中用作说明的一种手段。我试图更全面地了解如何listofitems
在 Tikz 环境中迭代包中的列表。
\documentclass{standalone}
\usepackage{tikz, listofitems}
\usetikzlibrary{calc}
\newcommand{\polyline}[2][,]{
\setsepchar{#1}
\readlist*\inputlist{#2}
[create coords/.code={
\foreach \i in {1, ..., \inputlistlen} {
\coordinate (coord\i) at (\inputlist[\i]);
}
}, create coords]
(coord1)
\foreach \i in {2, ..., \inputlistlen} {
-- (coord\i)
}
}
\begin{document}
\begin{tikzpicture}
\draw \polyline[:]{0,0: 1,0};
\end{tikzpicture}
\end{document}
答案1
如果你按照这个方法操作,那么也可以使用技巧将宏偷偷放入路径中。并使用样式。
\documentclass{standalone}
\usepackage{tikz, listofitems}
\newcommand{\polyline}[2][,]{
\setsepchar{#1}
\readlist*\inputlist{#2}
\tikzset{insert path={foreach \i in {1, ..., \inputlistlen}
{({\inputlist[\i]}) coordinate (coord\i)}
plot[samples at={1, ..., \inputlistlen}] (coord\x)}}
}
\tikzset{polyline/.code={\expandafter\polyline#1}}
\begin{document}
\begin{tikzpicture}
\draw [polyline={[:]{0,0: 1,0: 3,2}}];
\end{tikzpicture}
\end{document}
答案2
我并不精通tikz
,但通过将其\draw
移入宏(作为参数),您可以使其发挥作用。
\documentclass{standalone}
\usepackage{tikz, listofitems}
\usetikzlibrary{calc}
\newcommand{\polyline}[3][,]{
\setsepchar{#1}
\readlist*\inputlist{#3}
[create coords/.code={
\foreach \i in {1, ..., \inputlistlen} {
\coordinate (coord\i) at (\inputlist[\i]);
}
}, create coords]
#2 (coord1)
\foreach \i in {2, ..., \inputlistlen} {
-- (coord\i)
}
}
\begin{document}
\begin{tikzpicture}
\polyline[:]\draw{0,1: 1,0};
\end{tikzpicture}
\end{document}
不过,显然 OP 的 MWE 的问题在于,在\draw
发出命令后,\polyline
会执行一堆\draw
宏未预料到的设置代码。因此,另一种方法是将其拆分为两个宏:
\documentclass{standalone}
\usepackage{tikz, listofitems}
\usetikzlibrary{calc}
\newcommand{\polylineinput}[2][,]{
\setsepchar{#1}
\readlist*\inputlist{#2}
[create coords/.code={
\foreach \i in {1, ..., \inputlistlen} {
\coordinate (coord\i) at (\inputlist[\i]);
}
}, create coords]
}
\newcommand{\polyline}{
(coord1)
\foreach \i in {2, ..., \inputlistlen} {
-- (coord\i)
}
}
\begin{document}
\begin{tikzpicture}
\polylineinput[:]{0,1: 1,0}
\draw\polyline;
\end{tikzpicture}
\end{document}
第三种方法是使用一个包含 的宏来\polylineinput
创建,这样就可以发出:\thepolyline
(coord1) -- (coord2)
\draw\thepolyline
\documentclass{standalone}
\usepackage{tikz, listofitems}
\usetikzlibrary{calc}
\newcommand{\polylineinput}[2][,]{
\setsepchar{#1}
\readlist*\inputlist{#2}
[create coords/.code={
\foreachitem\z\in\inputlist[] {
\coordinate (coord\zcnt) at (\z);
}
}, create coords]
\xdef\thepolyline{}
\foreach \i in {1, ..., \inputlistlen} {
\ifnum\i>1\relax\xdef\thepolyline{\thepolyline--}\fi
\xdef\thepolyline{\thepolyline(coord\i)}
}
}
\begin{document}
\begin{tikzpicture}
\polylineinput[:]{0,1: 1,0}
\draw\thepolyline;
\end{tikzpicture}
\end{document}