„Undefinierte Steuersequenz. Paket-Tikz-Fehler: Ich gebe diesen Pfad auf. Haben Sie ein Semikolon vergessen?.“ – LaTex-Fehler für 2 Sierpinski-Dreiecke

„Undefinierte Steuersequenz. Paket-Tikz-Fehler: Ich gebe diesen Pfad auf. Haben Sie ein Semikolon vergessen?.“ – LaTex-Fehler für 2 Sierpinski-Dreiecke

Ich versuche, zwei Sierpinski-Dreiecke zu zeichnen, die sich an einem Scheitelpunkt berühren. Mein Code lautet wie folgt:

\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}

Antwort1

Es ist vielleicht nicht die eleganteste Lösung, aber so sollte es funktionieren:

\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}

Bildbeschreibung hier eingeben


Ihr Code weist einige Probleme und andere Mängel auf.

  1. Mit \path #2;und Adem zweiten Argument erhalten Sie, \path A;was nicht gültig ist TikZ-Syntax und ist der Grund für den Fehler „fehlendes Semikolon“. Sie müssen hier Klammern verwenden und diese in den verschachtelten \createsierpinskiBefehlen entfernen.

  2. Wenn Sie [yshift=-0.25*#1]#2dem Befehl als zweites Argument angeben, erhalten Sie irgendwann ebenfalls eine ungültige Syntax. Dies ist jedoch eigentlich nicht erforderlich, yshiftda Sie zur Positionierung einfach die Anker der Knotenform verwenden können.

  3. Ihre Befehlsdefinition enthält derzeit weder einen \drawnoch einen \nodeBefehl, daher gibt es keine Ausgabe.

  4. Das können Sie nicht sagen \ifnum3-1>0, aber Sie müssen die Berechnung vorher durchführen, da \ifnumnur Ganzzahlen verglichen werden können. Sie können \pgfmathtruncatemacrozu diesem Zweck verwenden.

  5. Sie benötigen einen gewissen Gültigkeitsbereich, da sonst die erste Verschachtelung \createsierpinskidie Rekursionsschleife bereits beendet.

  6. Wenn Sie Dinge drehen möchten, müssen Sie diese Transformation als Option an jeden einzelnen \createsierpinskiBefehl übergeben.

Antwort2

Hier ist eine Version mit lindenmayersystems(Kapitel 57 imPGF-Handbuch).

Bildbeschreibung hier eingeben

\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}

verwandte Informationen