是否可以使用宏来命名和引用 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这表明您在选择整数值时需要小心,因为十进制值不能用作标签。