为了避免重复的代码行,我们有\tikzset
。
类似地,是否有可能使用来创建节点\newcommand
。
例如,
我们可以使用单个语句,而不是\node[draw=black] (a) at (0,0) {}
两个\node[draw=black] (b) at (0,5) {}
节点语句,
\newcommand[2]{\createnode}{\node[draw=black] #1 at #2 {}}
这种方法是否有效?通过这种方法创建的节点在以后可以访问吗?
scope
同样,采用这种方法,如果我们在两个范围内创建相同的节点,将如何工作。
这能行吗?
答案1
首先,你的语法\newcommand
是错误的。
\newcommand[2]{\createnode}{\node[draw=black] #1 at #2 {}}
不行。这些可以
\newcommand{\createnode}[2]{\node[draw=black] #1 at #2 {}}
\newcommand\createnode[2]{\node[draw=black] #1 at #2 {}} % I prefer this way
关于第一个问题,
这种方法是否有效?通过这种方法创建的节点在以后可以访问吗?
它可以工作(见下面的例子),但要注意括号、方括号和分号。
\documentclass[tikz]{standalone}
\newcommand\createnode[2]{\node[draw=black] (#1) at (#2) {}}
\begin{document}
\begin{tikzpicture}
\createnode{x}{0,0};
\createnode{y}{3,4};
\draw[-stealth] (x) to[bend left] (y);
\end{tikzpicture}
\end{document}
它可以与普通的\node
s 一起使用:
\documentclass[tikz]{standalone}
\newcommand\createnode[2]{\node[draw=black] (#1) at (#2) {}}
\begin{document}
\begin{tikzpicture}
\createnode{x}{0,0};
\node[circle,draw] (y) at (3,4) {$y$};
\draw[-stealth] (x) to[bend left] (y);
\end{tikzpicture}
\end{document}
它甚至可以用于remember picture
\documentclass[varwidth]{standalone}
\usepackage{tikz}
\newcommand\createnode[2]{\node[draw=black] (#1) at (#2) {}}
\begin{document}
This is a node: \tikz[remember picture]{\createnode{x}{0,2};}
And this is another node: \tikz[remember picture]{\createnode{y}{1,3};}
Let's try adding an arrow between them. It works!
\begin{tikzpicture}[overlay,remember picture]
\draw[-stealth] (x) to[bend left] (y);
\end{tikzpicture}
\end{document}
关于第二个问题,
同样,采用这种方法,如果我们在两个范围中创建相同的节点,范围将如何工作。
考虑以下代码:它没有使用\createnode
:
\documentclass[tikz]{standalone}
%\newcommand\createnode[2]{\node[draw=black] (#1) at (#2) {}}
\begin{document}
\begin{tikzpicture}
\begin{scope}
\node[draw] (x) at (2,3) {};
\node[draw] (z) at (0,3) {};
\draw[-stealth] (z) -- (x);
\end{scope}
\begin{scope}
\node[draw] (x) at (0,0) {};
\node[draw] (y) at (2,1) {};
\end{scope}
\draw[-stealth] (z) -- (x);
\end{tikzpicture}
\end{document}
节点 (X) 是重新定义在后面的范围内,所以两个箭头是不同的。
让我们尝试一下\createnode
:
\documentclass[tikz]{standalone}
\newcommand\createnode[2]{\node[draw=black] (#1) at (#2) {}}
\begin{document}
\begin{tikzpicture}
\begin{scope}
\node[draw] (x) at (2,3) {};
\node[draw] (z) at (0,3) {};
\draw[-stealth] (z) -- (x);
\end{scope}
\begin{scope}
%\node[draw] (x) at (0,0) {};
\createnode{x}{0,0};
\node[draw] (y) at (2,1) {};
\end{scope}
\draw[-stealth] (z) -- (x);
\end{tikzpicture}
\end{document}
\documentclass[tikz]{standalone}
\newcommand\createnode[2]{\node[draw=black] (#1) at (#2) {}}
\begin{document}
\begin{tikzpicture}
\begin{scope}
\node[draw] (x) at (2,3) {};
\createnode{x}{2,3};
\node[draw] (z) at (0,3) {};
\draw[-stealth] (z) -- (x);
\end{scope}
\begin{scope}
\node[draw] (x) at (0,0) {};
%\createnode{x}{0,0};
\node[draw] (y) at (2,1) {};
\end{scope}
\draw[-stealth] (z) -- (x);
\end{tikzpicture}
\end{document}
事实上什么都没有改变。
我的结论是:只要你小心使用,它绝对会发挥预期的作用。
我的评论:我认为为此定义一个新命令非常好。有时我也使用这种方式。但是,请仅当您的命令是真的很复杂,而且会重复多次,因为你必须非常小心地使用它——缺少一个分号会给你带来很多麻烦。不要对简单的命令过度使用这种方式\node
,否则在某些情况下调试代码可能会非常困难。