«Неопределенная управляющая последовательность. Ошибка пакета tikz: отказ от этого пути. Вы забыли точку с запятой?» — ошибка LaTex для 2 тренгглов Серпинского

«Неопределенная управляющая последовательность. Ошибка пакета tikz: отказ от этого пути. Вы забыли точку с запятой?» — ошибка LaTex для 2 тренгглов Серпинского

Я пытаюсь нарисовать два треугольника Серпинского, которые касаются вершины. Мой код следующий:

\documentclass[../main.tex]{subfiles}
\begin{document}
\begin{tikzpicture}[
  main tri/.style={isosceles triangle, isosceles triangle apex angle=60, draw, anchor=apex, inner sep=0},
  node distance=0mm,
  minimum height=6cm
]

% Define recursive macro to create the Sierpinski triangle pattern
\newcommand\createsierpinski[3]{
  \ifnum#3>0
    % Calculate size for the smaller triangles
    \pgfmathsetmacro{\newsize}{#1/2}
    % Calculate the position for the next set of triangles
    \path #2;
    \pgfmathsetmacro{\newya}{\y-0.25*#1}
    \pgfmathsetmacro{\newyb}{\y-0.75*#1}
    % Draw the three smaller triangles
    \createsierpinski{\newsize}{([yshift=-0.25*#1]#2)}{#3-1}
    \createsierpinski{\newsize}{([yshift=-0.25*#1]#2.east)}{#3-1}
    \createsierpinski{\newsize}{([yshift=-0.75*#1]#2.east)}{#3-1}
  \fi
}

% First Sierpinski triangle
\node[main tri] (A) {};
\createsierpinski{6cm}{A}{4}

% Second Sierpinski triangle (rotated to touch at the tip)
\node[main tri, rotate=180] (B) at (A.apex) {};
\createsierpinski{6cm}{B}{4}

\end{tikzpicture}
\end{document}

решение1

Возможно, это не самое элегантное решение, но оно должно работать:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}

\begin{document}
\begin{tikzpicture}[
    main tri/.style={
        isosceles triangle, 
        isosceles triangle apex angle=60, 
        draw, 
        anchor=apex, 
        inner sep=0pt
    },
    node distance=0mm,
    minimum height=6cm,
]

% Define recursive macro to create the Sierpinski triangle pattern
\newcommand\createsierpinski[4][]{
  \ifnum#4>0
    % Calculate size for the smaller triangles
    \pgfmathsetmacro{\newsize}{#2/2}
    \node[main tri, #1, anchor=apex, minimum height={\newsize}] 
        (#3-1) at (#3.apex) {};
    \node[main tri, #1, anchor=right corner, minimum height={\newsize}] 
        (#3-2) at (#3.right corner) {};
    \node[main tri, #1, anchor=left corner, minimum height={\newsize}] 
        (#3-3) at (#3.left corner) {};
    % Draw the three smaller triangles
    \pgfmathtruncatemacro{\newi}{#4-1}
    \begin{scope}
        \createsierpinski[#1]{\newsize}{#3-1}{\newi}
    \end{scope}
    \begin{scope}
        \createsierpinski[#1]{\newsize}{#3-2}{\newi}
    \end{scope}
    \begin{scope}
        \createsierpinski[#1]{\newsize}{#3-3}{\newi}
    \end{scope}
  \fi
}

\pgfmathsetmacro{\y}{1}

% First Sierpinski triangle
\node[main tri] (A) {};
\createsierpinski{6cm}{A}{4}

% Second Sierpinski triangle (rotated to touch at the tip)
\node[main tri, rotate=180] (B) at (A.apex) {};
\createsierpinski[rotate=180]{6cm}{B}{4}

\end{tikzpicture}
\end{document}

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


В вашем коде есть некоторые проблемы и некоторые другие недостатки.

  1. С \path #2;и Aзаданным вторым аргументом вы получите, \path A;что не является допустимым TiкСинтаксис Z и является причиной ошибки "отсутствует точка с запятой". Здесь нужно использовать скобки и удалять их во вложенных \createsierpinskiкомандах.

  2. Если вы дадите [yshift=-0.25*#1]#2команду в качестве второго аргумента, вы также получите в какой-то момент неверный синтаксис. Но на самом деле в этом нет необходимости, yshiftпоскольку вы можете просто использовать якоря формы узла для позиционирования.

  3. В настоящее время определение вашей команды не включает ни команду \draw, ни \nodeкоманду , поэтому вывод отсутствует.

  4. Вы не можете сказать \ifnum3-1>0, но вам нужно сделать расчет заранее, потому что \ifnumможно сравнивать только целые числа. Вы можете использовать \pgfmathtruncatemacroдля этой цели.

  5. Вам необходимо некоторое ограничение области действия, поскольку в противном случае первое вложенное действие \createsierpinskiуже завершит цикл рекурсии.

  6. Если вы хотите повернуть что-то, вам нужно передать это преобразование как опцию каждой отдельной \createsierpinskiкоманде.

решение2

Вот версия, использующая lindenmayersystems(главу 57 вРуководство по ПГФ).

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

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{lindenmayersystems} 

\begin{document}

\begin{tikzpicture}[l-system={step=.5pt, order=8, angle=60}, rotate=-30]
  \pgfdeclarelindenmayersystem{Sierpinski triangle}{
    \symbol{X}{\pgflsystemdrawforward}
    \symbol{Y}{\pgflsystemdrawforward}
    \rule{X -> Y-X-Y}
    \rule{Y -> X+Y+X}
  }
  \draw[red] (0,0) l-system[l-system={Sierpinski triangle, axiom=+++X, anchor=north east}]; 
  \draw[blue] (0,0) l-system[l-system={Sierpinski triangle, axiom=X, anchor=south west}]; 
\end{tikzpicture}

\end{document}

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