为什么坐标 (X)[中间] 不起作用,而坐标[中间] (X) 可以?

为什么坐标 (X)[中间] 不起作用,而坐标[中间] (X) 可以?

coordinate为什么选项在名称后面就看不到?nodes选项在名称后面还是前面都没有区别。

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
    \draw (0,3) -- ++(5,0) node (A) [midway] (A) {};
    \draw (0,2) -- ++(5,0) node (B) [midway] {};
    \draw (0,1) -- ++(5,0) coordinate [midway] (C);
    \draw (0,0) -- ++(5,0) coordinate (D) [midway];
    \foreach \C in {A,B,C}
        \fill (\C) [green!70!black] circle [radius=1pt] node [above] {\C\ is ok};
    \fill (D) [red!70!black] circle [radius=1pt] node [above] {D is not};
    \fill (2.5,0) [green!70!black] circle [radius=1pt] node [above] {D};
\end{tikzpicture}
\end{document}

坐标选项

该点D应该和其他点一样位于线的中间,但似乎coordinate看不到该midway选项。我猜原因是 TikZ 解析坐标的方式(以 ? 开头,coor…以 ? 结尾…)),但我想知道这是否是一个错误,应该报告...

答案1

我猜原因在于 TikZ 解析坐标的方式(以 ? 开头,以?coor…结尾…))[…]

什么是coordinate
坐标只不过是node一个除了一个坐标之外没有其他任何内容的形状(.center锚点与所有其他锚点相同)。

TikZ 如何工作?
它会扫描整个过程\path并寻找关键词或\futurelets 和ifnextchars 组合中的字符序列。

如果遇到 ,c它会测试是否为 ,i否则circle它必须(应该)是 ,h否则它必须为 。它测试是否还有另一个 ,否则它必须为。childoocos

如果一切正常(即co没有以下内容o\tikz@coordinate就会被调用。

% Syntax for coordinates:
% coordinate[options] (coordinate name) at (point)
% where ``at (point)'' is optional
\def\tikz@coordinate ordinate{%
  \pgfutil@ifnextchar[{\tikz@@coordinate@opt}{\tikz@@coordinate@opt[]}}
\def\tikz@@coordinate@opt[#1]{%
  \pgfutil@ifnextchar({\tikz@@coordinate[#1]}
  {\tikz@fig ode[shape=coordinate,#1]{}}}%}
\def\tikz@@coordinate[#1](#2){%
  \pgfutil@ifnextchar a{\tikz@@coordinate@at[#1](#2)}
  {\tikz@fig ode[shape=coordinate,#1](#2){}}}
\def\tikz@@coordinate@at[#1](#2)a{%
  \pgfutil@ifnextchar t{\tikz@@coordinate@@at[#1](#2)a}%
  {\tikz@fig ode[shape=coordinate,#1](#2){}a}%
}

然后,宏\tikz@coordinate(吞噬ordinate)检查[(或假设无选项坐标,因此为空[])。TikZ 仅允许此时coordinate [optional arguments] (optional name)(以及at我现在将省略的末尾部分)。如果找到此序列(有或没有at),则使用绝对最终(空)节点文本(无论如何在 的情况下都会被忽略)创建一个实际节点coordinate

节点文本{}在路径中的节点路径运算符上绝对是最终的。此后,使用的每个选项都将应用于路径(例如[draw])。在您的示例中[midway],为路径设置了(无论如何,这是默认值),并且仅适用于路径运算符(如--)和目标坐标之间的节点/坐标。

\tikz@fig ode的工作方式略有不同,因为它始终测试选项[、名称(和位置at。这些可以自由混合,因为它的工作方式类似于以 结尾的整个路径;

另一种看待它的方式是使用:

\draw (0,1) -- ++(5,0) coordinate [midway, red] (C);
\draw (0,0) -- ++(5,0) coordinate (D) [midway, red];

在第一行中,坐标(没有路径)将是红色的,在第二种情况下,路径是红色的,就像您写的一样\draw[red]


[…] 但我想知道这是否是一个错误并且应该被报告……

那么,如何表示coordinate路径操作的结束呢?TikZ 定义

…             coordinate          [<options>]   (<name>)    at (<position>)  …

^                 ^                   ^            ^         ^        ^      ^
rest of path  specifies a coord.   optional    optional       optional    rest of path

完全按照这个顺序,其中一个可选序列是坐标的最后部分。它甚至不允许

coordinate at (<somewhere>) [<options>] (<name>)

但确实如此

node[shape=coordinate] at (<somewhere) [<options>]
               (<name>) [<other options>] (<overwriting the previous set name>) {}

相关内容