更新

更新

这是来自这里. 事情是几乎可以正常工作,但我的命令出现了一些奇怪的情况\band。它正确地渲染了第一个波段,但第二个波段却导致事情变得混乱。

\documentclass[]{scrartcl}

\usepackage{tikz}
\usepackage{listofitems}

\begin{document}

\newtoks\pathtoks
\newcommand\addpathtoks[1]{%
    \pathtoks\expandafter{\the\pathtoks#1}}
\newcommand\xaddpathtoks[1]{%
    \expandafter\addpathtoks\expandafter{#1}}
\newcommand\xxaddpathtoks[1]{%
    \expandafter\xaddpathtoks\expandafter{#1}}

\newcommand{\band}[2]{
    \readlist*\valuelist{#2}
    \pathtoks{}
    \foreachitem\x\in\valuelist[]{%
        \ifnum\xcnt=1\relax \addpathtoks{\draw[#1]}\else
            \addpathtoks{--}
        \fi
        \addpathtoks{(360/}\xxaddpathtoks{\listlen\valuelist[]*}%
        \xaddpathtoks{\x:}\xaddpathtoks{\x)}
        \ifnum\xcnt=\listlen\valuelist[]\relax\addpathtoks{--cycle;}\fi
    }

    \the\pathtoks
}

\begin{tikzpicture}
    % This is what I expect the below \band invocations to produce, and this renders correctly.
    \draw[red] (360/3:1) -- (360/3*2:2) -- (360/3*3:3) --cycle;
    \draw[blue] (360/3:3) -- (360/3*2:2) -- (360/3*3:1) --cycle;
\end{tikzpicture}

\vspace{1cm}

\begin{tikzpicture}
    % These bands, which should be equivalent to the above are not rendering correctly.
    \band{red}{1,2,3};
    \band{blue}{3,2,1};
\end{tikzpicture}

\end{document}

渲染结果如下:

在此处输入图片描述

上面的图片是我所期望的,但下面的图片似乎在现有图片的顶部重新渲染了相同的形状。

更奇怪的是,如果两个值相同:

\band{red}{2,3,3};

它呈现一条直线:

在此处输入图片描述

如果所有三个值都相同,则什么也不会呈现!就像是删除列表中的重复项一样……?

我的问题是:

  1. 为什么上面的再现渲染了两次相同的三角形而不是预期的三角形?
  2. 为什么重复的值会导致奇怪的事情发生?

更新

我的要求是:

  1. 能够在带区中指定任意数量的值,并让带区自动放置这些距离圆心的值,每个值之间的度数相等。
  2. 能够band以不同数量的值和不同的乐队风格来调用此命令/环境/无论它是什么。
  3. 能够将这个band东西最终组合到一个环境中,这样我就可以做类似的事情:
\begin{thething}
    \band{red}{1,3,2}
    \band{blue}{1,2,4}
\end{thething}

\begin{thething}
    \band{green}{5,3,4,1}
    \band{yellow}{1,1,4,5}
\end{thething}

环境thething(我相信我已经让它工作了)添加了必备条件tikzpicture以及一些默认渲染。实际上,thething它采用要渲染的标签列表 - 带区中的每个值都有一个标签。band然后调用添加到该渲染中。

答案1

Z 内置了各种方法来简化这一过程。所有这些宏都可以用简单的方式吸收

band/.style={insert path={plot[samples at={0,1,2}]
    ({360/3*(\x+1)}:{#1}[\x]) -- cycle}}

你只需要说

\draw[red,band={1,2,3}];

可以使其成为一个宏,但这会降低它的功能。MWE:

\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}[band/.style={insert path={plot[samples at={0,1,2}]
    ({360/3*(\x+1)}:{#1}[\x]) -- cycle}},font=\sffamily]

  \begin{scope}[xshift=-5cm,local bounding box=by hand]
    \draw[red] (360/3:1) -- (360/3*2:2) -- (360/3*3:3) --cycle;
    \draw[blue] (360/3:3) -- (360/3*2:2) -- (360/3*3:1) --cycle;
  \end{scope}   
  \node[above=1ex] at (by hand.north){by hand};
  %
  \begin{scope}[local bounding box=automatic]
    \draw[red,band={1,2,3}];
    \draw[blue,band={3,2,1}];
  \end{scope}   
  \node[above=1ex] at (automatic.north){automatic};
\end{tikzpicture}
\end{document}

在此处输入图片描述

很容易将其推广到采用任意数量参数的东西。

\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}[band/.style={/utils/exec={\foreach \dummy[count=\cnt
starting from 0] in {#1} {\xdef\cnt{\cnt}}},
insert path={plot[samples at={0,...,\cnt}]
    ({360/(\cnt+1)*(\x+1)}:{#1}[\x]) -- cycle}},font=\sffamily]

  \begin{scope}[xshift=-5cm,local bounding box=by hand]
    \draw[red] (360/3:1) -- (360/3*2:2) -- (360/3*3:3) --cycle;
    \draw[blue] (360/3:3) -- (360/3*2:2) -- (360/3*3:1) --cycle;
  \end{scope}   
  \node[above=1ex] at (by hand.north){by hand};
  %
  \begin{scope}[local bounding box=automatic]
    \draw[red,band={1,2,3}];
    \draw[blue,band={3,2,1}];
    \draw[orange,band={3,2,1,4,3,5}];
  \end{scope}   
  \node[above=1ex] at (automatic.north){automatic};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容