我正在尝试绘制正多边形,但我希望边数和外接圆半径都是绘制该多边形的命令的参数。这是我的 MnWE:
\documentclass[tikz,border=1.5cm]{standalone}
\newcommand\polygon[3][]{
% \pgfmathsetlength{\len}{#3}% Third argument with units.
\pgfmathsetlength{\len}{+ #3 cm}% Third argument with units.
% \pgfmathsetmacro{\len}{#3}% Add cm or other unit when using.
\pgfmathsetmacro{\angle}{360/#2}
\pgfmathsetmacro{\edge}{-90+\angle}
\begin{scope}[#1]
\foreach \i in {0,1,2,...,#2} {
\pgfmathsetmacro{\t}{\edge + \angle*\i}
\draw (\t:\len cm) --
}
-- cycle;
\end{scope}
}
\begin{document}
\begin{tikzpicture}[opacity=0.8]
\polygon{5}{1}
\end{tikzpicture}
\end{document}
我收到以下错误:
! Package tikz Error: Cannot parse this coordinate.See the tikz package documentation for explanation.Type H <return> for immediate help.... \polygon{5}{1}
! Package tikz Error: Giving up on this path. Did you forget a semicolon?.See the tikz package documentation for explanation.Type H <return> for immediate help.... \polygon{5}{1}
实际上,我在 TeXMaker 的日志消息窗口中看到了 6 次相同的行。我尝试使用注释行代替未注释行,但没有任何效果。
那么我的问题是如何将我想要的长度传递给这个命令。我尝试过传递这个参数,带单位和不带单位,以及带和不带手册第 1027 页推荐的 + 号(我使用的是 3.1.5b 版)。即使我修复了长度并只为 2 个参数定义命令,代码也不起作用;也就是说,如果\len
我直接使用1cm
并将命令定义为只有 2 个参数,代码也无法工作。我是否缺少一个库或一个额外的包来与 `\pgfmathsetmacro`` 命令一起使用?提前致谢!
答案1
主要问题是\foreach
循环启动了多条未完成的路径。如果修复了这个问题,就会得到一个多边形。
\documentclass[tikz,border=1.5cm]{standalone}
\newcommand\polygon[3][]{
\pgfmathsetmacro{\len}{#3}% Add cm or other unit when using.
\pgfmathsetmacro{\angle}{360/#2}
\pgfmathsetmacro{\edge}{-90+\angle}
\begin{scope}[#1]
\draw (\edge:\len)
foreach \i in {1,2,...,\the\numexpr#2-1} {
%\pgfmathsetmacro{\t}{\edge + \angle*\i}
-- (\edge + \angle*\i:\len)
}
-- cycle;
\end{scope}
}
\begin{document}
\begin{tikzpicture}[opacity=0.8]
\polygon{5}{1}
\end{tikzpicture}
\end{document}
当然,还有更简单的方法来绘制多边形,例如使用shapes.geometric
库。你也不需要任何这些\pgfmathsetmacro
。Ti钾无论如何,Z 都会解析坐标。
\documentclass[tikz,border=1.5cm]{standalone}
\newcommand\polygon[3][]{
\begin{scope}[#1]
\draw (-90+360/#2:#3)
foreach \i in {1,2,...,\the\numexpr#2-1} {
-- (-90+360/#2 +\i*360/#2:#3)
}
-- cycle;
\end{scope}
}
\begin{document}
\begin{tikzpicture}[opacity=0.8]
\polygon{5}{1}
\end{tikzpicture}