这是来自这里. 事情是几乎可以正常工作,但我的命令出现了一些奇怪的情况\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};
它呈现一条直线:
如果所有三个值都相同,则什么也不会呈现!就像是删除列表中的重复项一样……?
我的问题是:
- 为什么上面的再现渲染了两次相同的三角形而不是预期的三角形?
- 为什么重复的值会导致奇怪的事情发生?
更新
我的要求是:
- 能够在带区中指定任意数量的值,并让带区自动放置这些距离圆心的值,每个值之间的度数相等。
- 能够
band
以不同数量的值和不同的乐队风格来调用此命令/环境/无论它是什么。 - 能够将这个
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}