我正在尝试定义一个新命令以在 TikZ 图片中使用。但似乎我无法使用\def
newcommand 定义中的变量(在本例中为 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”定义时,此代码工作正常...但是,这当然会产生一个相当长且难以阅读的新命令定义。
那么我做错了什么,我似乎无法根据我的\def
s 进行计算?
答案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}