`\node` 和 `\coordinate` 的实现在显示上存在差异

`\node` 和 `\coordinate` 的实现在显示上存在差异

这里有四种TikZ环境来绘制两条平行线段。在所有环境中,第一条线段的一个端点都用 或 指定\coordinate(A)\node(A){$A$};第二条线段的一个端点都用\coordinate(B)或指定\node(B){$B$};

首先指定点 A;没有给出它的坐标。TikZ默认情况下将其放置在原点吗?它似乎被放置在原点,因为在第二个图中,我有命令\node at (0,0) {$O$};,并且“O”被排版在 A 的坐标处。

除了“A”的位置不同之外,第二个和第三个显示完全相同。在第二个显示中,我使用\coordinate(A);\node at (0,0) {$A$};来定位“A”,而在第三个显示中,我使用\node[inner sep=0pt,outer sep=0pt] (A){$A$};来定位“A”。在第二个显示中,“A”似乎位于 (0,0) 的中心,而在第三个显示中,“A”似乎排版在 (0,0) 的左侧。为什么会有差异?

第三和第四个显示屏的编码中唯一的区别是,我inner sep=0pt在节点命令中有一个选项用于在第三显示屏中排版“A”,inner sep=1.5pt在节点命令中有一个选项用于在第四个显示屏中排版“A”。与第三显示屏相比,为什么这会移动第四显示屏中的“所有内容”?

\documentclass{amsart}
\usepackage{tikz}\usetikzlibrary{calc,positioning}
\begin{document}

    \begin{tikzpicture}
    \coordinate(A);
    \coordinate[right=of A](B);
    \draw[yellow, line width=2pt] (A) -- ++(1,1);
    \draw[red] (B) -- ++(1,1);
    \end{tikzpicture}
    \vskip1.25mm

    \begin{tikzpicture}
    \coordinate(A);
    \coordinate[right=of A](B);
    \draw[yellow, line width=2pt] (A) -- ++(1,1);
    \draw[red] (B) -- ++(1,1);
    \node at (0,0) {$A$};
    \end{tikzpicture}
    \vskip1.25mm

    \begin{tikzpicture}
    \node[inner sep=0pt,outer sep=0pt] (A){$A$};
    \coordinate[right=of A](B);
    \draw[yellow, line width=2pt] (A) -- ++(1,1);
    \draw[red] (B) -- ++(1,1);
    \end{tikzpicture}
    \vskip1.25mm

    \begin{tikzpicture}
    \node[inner sep=1.5pt,outer sep=0pt] (A) {$A$};
    \coordinate[right=of A] (B);
    \draw[yellow, line width=2pt] (A) -- ++(1,1);
    \draw[red] (B) -- ++(1,1);
    \end{tikzpicture}

\end{document}

答案1

以下内容有帮助吗?

\documentclass[tikz,border=5pt,mult]{standalone}
\usetikzlibrary{positioning}

\begin{document}

  \begin{tikzpicture}[every node/.style={draw}]
    \draw [help lines] (-1,-1) grid (2,2);
    \coordinate(A);
    \coordinate[right=of A](B);
    \draw [blue] (A) -- ++(1,1);
    \draw (B) -- ++(1,1);
    \node at (0,0) {$A$};
    \path [fill=blue] (0,0) circle (1.5pt);
  \end{tikzpicture}

  \begin{tikzpicture}[every node/.style=draw]
    \draw [help lines] (-1,-1) grid (2,2);
    \node[inner sep=0pt,outer sep=0pt] (A){$A$};
    \coordinate[right=of A](B);
    \draw [blue] (A) -- ++(1,1);
    \draw (B) -- ++(1,1);
    \path [fill=blue] (0,0) circle (1.5pt);
  \end{tikzpicture}

\end{document}

情况1

在第一种情况下,蓝线是从坐标A,并B相对于此坐标定位。由于坐标是点,因此这相当于从 处绘制(0,0)

案例 2

在第二种情况下,蓝线从节点 开始绘制A,并B相对于节点定位。TikZ 假设您要从节点边界上的最近点绘制或测量。即使A有零inner sepouter sep,它仍然具有正大小,因为它包含占用空间的字母A。因此,在这种情况下,线是从 的稍上方和 的稍右侧绘制的(0,0),并B相对于 的稍右侧的点定位(0,0)

您可以通过指定center

  \begin{tikzpicture}[every node/.style=draw]
    \draw [help lines] (-1,-1) grid (2,2);
    \node[inner sep=0pt,outer sep=0pt] (A){$A$};
    \coordinate[right=of A.center](B);
    \draw [blue] (A.center) -- ++(1,1);
    \draw (B) -- ++(1,1);
    \path [fill=blue] (0,0) circle (1.5pt);
  \end{tikzpicture}

使用锚点模拟坐标

或者,如果节点A没有内容,并且为零sep,它的行为将类似于坐标,因为它基本上不占用空间:

  \begin{tikzpicture}[every node/.style=draw]
    \draw [help lines] (-1,-1) grid (2,2);
    \node[inner sep=0pt,outer sep=0pt] (A){};
    \coordinate[right=of A](B);
    \draw [blue] (A) -- ++(1,1);
    \draw (B) -- ++(1,1);
    \node at (A) {$A$};
    \path [fill=blue] (0,0) circle (1.5pt);
  \end{tikzpicture}

使用空节点模拟坐标

请注意,在每种情况下A都以原点(0,0)(以蓝点标记)为中心。

相关内容