是否可以使用宏来命名 TikZ 节点?

是否可以使用宏来命名 TikZ 节点?

是否可以使用宏来命名和引用 TikZ 节点。例如:

\begin{tikzpicture}
    \node (0) at (0,0) {X};
    \node (\mymacro{2}{3}) at (1,2) {Y};
    \draw (\mymacro{2}{3}) -- (0);
\end{tikzpicture}

哪里\mymacro是(例如):

\newcount\counterA
\def\mymacro#1#2%
{\counterA=#1\relax%
\advance\counterA by#2\relax%
\the\counterA}

我的宏计算使用的实际计算\loop\ifnum(我认为)意味着我无法使用解决方案TikZ 中节点名称的模块化运算?无需定义新\pgfmathMyMacro函数。

这是 TikZ 的限制吗,或者我可以使用一些\edef\expandafter魔法吗?

答案1

问题是由于扩展造成的。TikZ 通过 命名节点,\edef因此确定节点的宏必须在 中可扩展\edef。我不知道什么是可扩展的,什么是不可扩展的,但你使用的宏\count是不可扩展的。你可以通过执行以下操作来看到这一点:

\def\test#1#2{%
\countA#1
\advance\countA by #2
\the\countA}
\edef\testit{\test{2}{3}}
\show\testit

结果是:

> \testit=macro:
->\countA 2 \advance \countA by 3 0.

任何使用的东西\pgfmathparse也不可扩展,而且我猜你尝试的任何其他东西也不可扩展。

幸运的是,那些 LaTeX3 专家是扩展大师,他们的整数似乎是可扩展的。因此:

\usepackage{expl3}
\ExplSyntaxOn
\def\mymacro#1#2%
{\int_eval:n {#1 + #2}}
\ExplSyntaxOff

\edef\testit{\mymacro{2}{3}}
\show\testit

结果:

> \testit=macro:
->5.

确实,下面的代码有效。节点被正确标记为(5)

\documentclass{article}
%\url{http://tex.stackexchange.com/q/27769/86}
\usepackage{expl3}
\usepackage{tikz}

\ExplSyntaxOn
\newcount\countA
\def\mymacro#1#2%
{\int_eval:n {#1 + #2}}
\ExplSyntaxOff

\begin{document}
\begin{tikzpicture}
    \node (0) at (0,0) {X};
    \node (\mymacro{2}{3}) at (1,2) {Y};
    \draw (\mymacro{2}{3}) -- (0);
    \draw (5) -- +(1,0);
\end{tikzpicture}
\end{document}

答案2

这似乎有效:

\documentclass{article}
\usepackage{tikz}

\newcommand*{\mymacro}[2]{#1+#2}%

\begin{document}
\begin{tikzpicture}
    \node (0) at (0,0) {X};
    \node (\mymacro{2}{3}) at (1,2) {Y};
    \draw (\mymacro{2}{3}) -- (0);
\end{tikzpicture}
\end{document}

正如 Andrew 提到的,不幸的是,这会导致节点被命名2+3而不是5。为了解决这个问题,我尝试使用这个问题的解决方案pgfmath 扩展 - 从 pgfmath 环境中调用命令如下:

\newcommand{\mathresult}[1]{%
    \pgfmathparse{#1}\pgfmathsetmacro\mymathresult{\pgfmathresult}%
}
\newcommand{\mymacro}[2]{%
    \mathresult{#1}%
    \pgfmathparse{#2 + \mymathresult}%
    \pgfmathsetmacro\mymathresult{\pgfmathresult}\mathresult%
}%

但使用时会导致出现错误Incomplete \iffalse。我尽可能简化上述内容,但无法消除该错误消息。

请参阅后续问题:使用 pgfmath 命名 TikZ 节点的不完整 \iffalse这表明您在选择整数值时需要小心,因为十进制值不能用作标签。

相关内容