定义新的 TikZ 命令时如何在计算中使用变量

定义新的 TikZ 命令时如何在计算中使用变量

我正在尝试定义一个新命令以在 TikZ 图片中使用。但似乎我无法使用\defnewcommand 定义中的变量(在本例中为 s)。至少不是我现在这样做的方式:

\documentclass{standalone}
\usepackage{tikz}

\newcommand{\drawbox}[3]{
    \def \angle {30}
    \def \xd {{2/3*cos(\angle)}}
    \def \yd {{2/3*sin(\angle)}}
    \def \x {{#1-1+(#2-1)*(\xd)}}
    \def \y {{#3-1+(#2-1)*(\yd)}}

    \draw (\x,\y) -- ({(\x)+1},\y) -- ({(\x)+1},{(\y)+1}) -- (\x,{(\y)+1}) -- cycle;
    \draw (\x,{(\y)+1}) -- ({(\x)+(\xd)},{(\y)+1+(\yd)}) -- ({(\x)+1+(\xd)},{(\y)+1+(\yd)}) -- ({(\x)+1},{(\y)+1}) -- cycle;
    \draw ({(\x)+1},{(\y)+1}) -- ({(\x)+1+(\xd)},{(\y)+1+(\yd)}) -- ({(\x)+1+(\xd)},{(\y)+(\yd)}) -- ({(\x)+1},\y) -- cycle;
}

\begin{document}
\begin{tikzpicture}
    \drawbox{1}{1}{1}
\end{tikzpicture}
\end{document}

当我不使用任何代码\def并且用 替换每个出现的 中的“angle”定义\angle、用 替换每个出现的 中的“xd”定义\xd、用 替换每个出现的 中的“yd”定义\yd、用 替换 中的“x”定义时,此代码工作正常...但是,这当然会产生一个相当长且难以阅读的新命令定义。

那么我做错了什么,我似乎无法根据我的\defs 进行计算?

答案1

整个立方体可以在一个语句中绘制。计算也可以使用新的 TikZ 库通过或键\draw完成:math\tikzmath{...}evaulate

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{math}

\newcommand{\drawbox}[3]{%
  \draw[
    evaluate={
      \angle = 30;
      \xd = 2/3*cos(\angle);
      \yd = 2/3*sin(\angle);
      \x = (#1)-1+((#2)-1)*\xd;
      \y = (#3)-1+((#2)-1)*\yd;
    },
  ]
    (\x, \y) -- ++(1, 0) -- ++(\xd, \yd) -- ++(0, 1)
      -- ++(-1, 0) -- ++(-\xd, -\yd) -- cycle
    (\x, \y+1) -- ++(1, 0) -- ++(\xd, \yd)
    (\x+1, \y) -- ++(0, 1)
  ;%
}

\begin{document}
\begin{tikzpicture}
  \drawbox{1}{1}{1}
\end{tikzpicture}
\end{document}

结果

评论:

  • 我还通过删除现在不同类型的不必要的括号,使路径规范变得不那么冗长。
  • 我还重新安排了路径绘制。线连接使用直角或钝角,以避免线连接使用尖角,因为尖角会伸出立方体框架之外。

pic使用TikZ 3.0 的新功能和 XYZ 坐标的变体:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{math}

\newdimen\unit
\newcommand*{\drawboxinit}{%
  \tikzset{%
    evaluate={
      \unit = 10mm;
      \angle = 30;
      \zx = 2/3*cos(\angle);
      \zy = 2/3*sin(\angle);
    },
    x=\unit,
    y=\unit,
    z={(\zx\unit, \zy\unit)},
    %
    drawbox/.pic={
      \draw
        (0, 0) -- ++(1, 0) -- ++(0, 0, 1) -- ++(0, 1)
        -- ++(-1, 0) -- ++(0, 0, -1) -- cycle
        (0, 1) -- ++(1, 0) -- ++(0, 0, 1)
        (1, 0) -- ++(0, 1)
      ;
    }  
  }  
}
\newcommand{\drawbox}[3]{%
  \path ({#1}, {#2}, {#3}) pic {drawbox};
}

\begin{document}
\begin{tikzpicture}
  \drawboxinit
  \drawbox{1}{1}{1}
\end{tikzpicture}
\end{document}

相关内容