“未定义的控制序列。软件包 tikz 错误:放弃此路径。您忘记了分号吗?” - 2 个谢尔宾斯基三角的 LaTex 错误

“未定义的控制序列。软件包 tikz 错误:放弃此路径。您忘记了分号吗?” - 2 个谢尔宾斯基三角的 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;无效的 TiZ 语法是导致“缺少分号”错误的原因。您需要在此处使用括号,并在嵌套\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}

相关内容