我有以下一段代码
\documentclass{article}
\usepackage{tikz}
\def\pos{5,5}
\begin{document}
\begin{tikzpicture}
\node (b) at (0,0) {test};
\node (a) \ifx\pos\pgfutil@empty\else at(\pos)\fi {something};
\end{tikzpicture}
\end{document}
我想测试宏是否\pos
持有一个位置,如果持有,我想用它来打印节点。但是,当我编译上面的示例时,我得到了一些错误:
包 tikz 错误:节点必须有一个(可能为空的)标签文本。
的使用
\@next
与其定义不符。
我做错了什么?或者我可以通过什么方式实现测试宏显示的目标?
答案1
回答这部分:
或者我可以通过什么方式来实现测试显示宏的目的?
这是一种用于pgfkeys
定义样式的方法tripos
(向在场的任何剑桥毕业生致歉),该方法检查\pos
它是否为空,如果不是,则它用于\pgfkeys
调用at
键来设置节点的位置。
\documentclass{article}
\usepackage{tikz}
\def\pos{5,5}
\tikzset{tripos/.code={%
\unless\ifx\pos\empty
\pgfkeys{/tikz/at=(\pos)}
\fi
}
}
\begin{document}
\begin{tikzpicture}
\node (b) at (0,0) {test};
\node[tripos] (a) {something};
\end{tikzpicture}
\end{document}
(正如 David Carlisle 在对您的问题的评论中指出的那样,使用@
需要\makeatletter ... \makeatother
魔法。由于您使用的是 LaTeX,我们可以针对\empty
而不是进行测试\pgfutil@empty
,从而避免此问题。)
答案2
at
当 TikZ在 之后寻找规范时\node (a)
,它不会扩展标记。因此,在您的情况下,它会找到\ifx
它不喜欢的。
如果你确实需要这样的测试,可以使用下面的方法:
\begin{tikzpicture}
\node (b) at (0,0) {test};
\begingroup\edef\x{\endgroup\noexpand\node (a) \ifx\pos\empty\else at(\pos)\fi}
\x {something};
\end{tikzpicture}
因为它扩展了条件前TikZ 可以看到\node
。
\pgfutil@empty
请注意,除非您在环境\makeatletter
之前进行设置,否则您无法使用tikzpicture
(对我来说这似乎是小菜一碟)。