在 TikZ 环境中解析非逗号分隔列表

在 TikZ 环境中解析非逗号分隔列表

这个答案我看到我们可以使用[<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}

相关内容