LaTeX 中的 \newcommand 返回 TikZ 节点

LaTeX 中的 \newcommand 返回 TikZ 节点

为了避免重复的代码行,我们有\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}

在此处输入图片描述

它可以与普通的\nodes 一起使用:

\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,否则在某些情况下调试代码可能会非常困难。

相关内容