使用 \coordinate 中的坐标宏

使用 \coordinate 中的坐标宏

看起来下面两行代码并不等价:

\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}

相关内容