「未定義の制御シーケンスです。パッケージ tikz エラー: このパスを諦めます。セミコロンを忘れましたか?」 - 2 つのシェルピンスキー列の LaTex エラー

「未定義の制御シーケンスです。パッケージ tikz エラー: このパスを諦めます。セミコロンを忘れましたか?」 - 2 つのシェルピンスキー列の 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;を2番目の引数に与えると、有効ではないTiAが返されます。\path A;Z 構文は「セミコロンが欠落している」エラーの原因です。ここでは括弧を使用し、ネストされた\createsierpinskiコマンドでは括弧を削除する必要があります。

  2. コマンドに 2 番目の引数を与えると、ある時点で無効な構文が返されます。ただし、配置にはノード シェイプのアンカーを使用するだけでよいため、[yshift=-0.25*#1]#2実際には必要ありません。yshift

  3. コマンド定義には現在 もコマンド\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}

関連情報