"정의되지 않은 제어 시퀀스. 패키지 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;두 번째 인수를 사용 하면 유효하지 않은 Ti를 A얻게 됩니다.\path A;케이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장) 을 사용하는 버전입니다.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}

관련 정보