看起来下面两行代码并不等价:
\documentclass{article}
\usepackage{tikz}
\def\coord{(0,0)}
\begin{document}
% \tikz \coordinate at \coord;
\tikz \node[coordinate] at \coord {};
\end{document}
也就是说,第一行(注释行)代替第二行时会出现错误。我对该\coordinate
命令的理解是它等同于\node[coordinate] {}
,所以我是否遗漏了什么,或者这是一个错误?
这个问题似乎和在 pgfplots 图中,使用宏作为坐标(除此之外)但这不是可扩展性的问题:\coord
显然是完全可扩展的,并且确实在几乎相同的命令中在看似相同的上下文中工作。
答案1
在正常图像中\node
等同于\path node
且\coordinate
等同于\path coordinate
:
\node:
macro:->\tikz@path@overlay {node}
\coordinate:
macro:->\tikz@path@overlay {coordinate}
\tikz@path@overlay:
macro:#1->\let \tikz@signal@path =\tikz@signal@path \pgfutil@ifnextchar <{\tikz@path@overlayed {#1}}{\path #1}
(对于覆盖来说有点不同,例如在 中使用beamer
)
两者的区别在于\node
的语法更灵活,即可以有不同的内容跟随。例如,它可以有名称或没有名称,并且顺序不固定。因此,后面的内容在解析之前总是被展开。这解决了宏的问题\coord
。但是,\coordinate
的语法相当固定\coordinate[<options>] (<name>) at (<position>);
,因此解析方式不同。
您的示例代码没有(<name>)
导致第一个错误的部分。未命名的坐标没有意义。但是,即使有名称,它仍然会产生错误。使用以下解析宏,它需要(
在 之后的某个地方。如果不存在该部分,则使用默认值预先添加at
该部分。[ ]
\tikz@@coordinate@@at:
macro:[#1](#2)at#3(->\def \tikz@coordinate@caller {\tikz@fig ode[shape=coordinate,#1](#2)at}\tikz@scan@one@point \tikz@@coordinate@at@math (
因此,解决这个问题的一种方法是将 移到宏( )
的外部\coord
。这似乎可行,至少在您的 MWE 中如此。
\documentclass{article}
\usepackage{tikz}
\def\coord{0,0}
\begin{document}
\tikz \coordinate (name) at (\coord);
\tikz \node[coordinate] at (\coord) {};
\end{document}