РЕДАКТИРОВАТЬ

РЕДАКТИРОВАТЬ

Я отчаянно пытаюсь сделать это.

\documentclass{minimal}
\usepackage{tikz}

\newcommand\polygon[3][]{
    \pgfmathsetmacro{\angle}{360/#2}
    \pgfmathsetmacro{\startangle}{0}
    \begin{scope}[#1]
        \draw \foreach\i in {1,...,#2}{ 
            \pgfmathsetmacro{\x}{cos(\startangle + \angle*\i)*#3}
            \pgfmathsetmacro{\y}{sin(\startangle + \angle*\i)*#3}
            \ifnum\i=1 \else--\fi ({\x},{\y})
        };
    \end{scope}
}

\begin{document}
\begin{tikzpicture}
\polygon{5}{1}
\end{tikzpicture}
\end{document}

Я перерыл весь интернет, пытаясь найти советы по решению проблем других людей, которые могли бы мне помочь, но я все еще получаю эту ошибку

Package tikz Error: Giving up on this path. Did you forget a semicolon?.

Что я упускаю? У меня нет опыта работы с TikZ.

ОБНОВЛЯТЬ: после нескольких попыток я просто понял, что моя проблема как-то связана с двумя \pgfmathsetmacroвнутри цикла. Есть какие-нибудь советы, как заставить это работать?

решение1

Вы хотели что-то подобное?

\documentclass[tikz,border=5pt]{standalone}
\newcommand\polygon[3][]{
  \pgfmathsetmacro{\angle}{360/#2}
  \pgfmathsetmacro{\startangle}{0}
  \begin{scope}[#1]
    \draw \foreach\i in {1,...,#2}{
      \ifnum\i=1 \else--\fi ({cos(\startangle + \angle*\i)*#3},{sin(\startangle + \angle*\i)*#3})
    };
  \end{scope}
}

\begin{document}
  \begin{tikzpicture}
    \polygon{5}{1}
  \end{tikzpicture}
\end{document}

Я не думаю, что можно использовать что-то вроде этого \pgfsetmacroв середине пути, но можно просто включить вычисления в спецификацию координат.

Это создает открытый пятиугольник:

открытый пятиугольник

minimalКстати, не используйте в качестве примеров.

РЕДАКТИРОВАТЬ

Обратите внимание, что вы также можете использовать pic. Я не знаю точно, что вы хотите поместить в спецификацию области действия, но вы можете передать некоторые вещи, используя pic actionsследующее:

\documentclass[tikz,border=5pt]{standalone}
\tikzset{
  pics/open polygon/.style n args=2{
    code={
      \pgfmathsetmacro{\angle}{360/#1}
      \pgfmathsetmacro{\startangle}{0}
        \draw [pic actions] \foreach\i in {1,...,#1}{
          \ifnum\i=1 \else--\fi ({cos(\startangle + \angle*\i)*#2},{sin(\startangle + \angle*\i)*#2})
        };
    }
  },
}

\begin{document}
  \begin{tikzpicture}
    \pic [draw=cyan!50!blue, outer color=cyan!50!blue, inner color=cyan!15] {open polygon={5}{1}};
  \end{tikzpicture}
\end{document}

открытый пятиугольник с причудливой заливкой

решение2

Проблема возникает из-за макроса расчета внутри \drawпути. Поэтому я предлагаю отделить расчет от рисования, сначала выполнив вычисления и сохранив результаты в \coordinates с метками a-1, a-2, ..., a-n, а затем нарисовать путь с помощью этих координат. Вот как это можно сделать:

\documentclass{standalone}
\usepackage{tikz}

\newcommand\polygon[3][]{
    \pgfmathsetmacro{\angle}{360/#2}
    \pgfmathsetmacro{\startangle}{0}
    \begin{scope}[#1]
            \foreach\i in {1,...,#2}{ 
            \pgfmathsetmacro{\x}{cos(\startangle + \angle*\i)*#3}
            \pgfmathsetmacro{\y}{sin(\startangle + \angle*\i)*#3}
            \coordinate (a-\i) at ({\x},{\y});
        }
    \draw\foreach \i in{1,...,#2}{\ifnum\i=1 \else --\fi (a-\i)};
    \end{scope}
}
\begin{document}
\begin{tikzpicture}
\polygon{5}{1}
\end{tikzpicture}
\end{document} 

введите описание изображения здесь

Связанный контент