“未定義的控制序列。tikz 套件錯誤:放棄這條路徑。您忘記了分號嗎?” - 2 個 Sierpinski 三角形的 LaTex 錯誤

“未定義的控制序列。tikz 套件錯誤:放棄這條路徑。您忘記了分號嗎?” - 2 個 Sierpinski 三角形的 LaTex 錯誤

我正在嘗試繪製兩個接觸頂點的謝爾賓斯基三角形。我的程式碼如下:

\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;無效的 TikZ 語法是「缺少分號」錯誤的原因。您需要在此處使用括號並在嵌套\createsierpinski命令中將其刪除。

  2. 如果您將[yshift=-0.25*#1]#2第二個參數提供給命令,則在某些時候您還會得到無效的語法。但實際上沒有必要,yshift只需使用節點形狀的錨點即可進行定位。

  3. 您的命令定義目前既不包含 a\draw也不包含\node命令,因此沒有輸出。

  4. 你不能說\ifnum3-1>0,但你需要預先進行計算,因為\ifnum只能比較整數。您可以\pgfmathtruncatemacro為此目的使用。

  5. 您需要一些範圍,因為否則第一個嵌套\createsierpinski將已經結束遞歸循環。

  6. 如果您想旋轉事物,則需要將此轉換作為選項傳遞給每個\createsierpinski命令。

答案2

這是一個使用的版本lindenmayersystems(第 57 章)PGF手冊)。

在此輸入影像描述

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

相關內容