Демонстрация различий в реализации `\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 sepи outer 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)(отмечено синей точкой).

Связанный контент