为什么 \ifx 在 TikZ 中的节点命令中不起作用?

为什么 \ifx 在 TikZ 中的节点命令中不起作用?

我有以下一段代码

\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(对我来说这似乎是小菜一碟)。

相关内容