Позиционирование узла с двумя измерениями

Позиционирование узла с двумя измерениями

Следующая цитата находится в главе 17, разделе 5.3 руководства pgf. («Эта опция» относится к указанию местоположения узла по двум измерениям.):

Эффект этой опции следующий. Сначала точка (<number or dimension 2>, <number or dimension 1>)вычисляется с использованием обычных правил оценки такой координаты, давая некоторое положение. Затем узел смещается на вертикальную составляющую этой точки. Якорь устанавливается на юг.

Я привожу пример, приведенный в руководстве. Иллюстрирует ли пример "эту опцию"? Как меняется and 3mmположение узла?

\documentclass{amsart}
\usepackage{tikz}
\usetikzlibrary{calc,angles,shapes,positioning}

\begin{document}

\begin{tikzpicture}
\draw [help lines] (0,0) grid (2,2);
\node at (1,1) [above=0.2 and 3mm, draw] {over};
\end{tikzpicture}

\end{document}

Кто-нибудь хочет привести более наглядный пример?

решение1

Опция не работает, если вы не добавите above right, above leftили below right, below left. Кроме того, у вас будут другие результаты, если вы опустите and 3mmout. Сравните следующее:

  • [above right=0.2, draw]

    введите описание изображения здесь

  • [above right=0.2 and 3mm, draw]

    введите описание изображения здесь

Как объясняется в цитате, якорь устанавливается к югу от узла. Якорь — это то, что «перемещается». Остальная часть формы, конечно, следует за ним. Если вы не знаете, что такое якоря, проверьте раздел 49 «Формы» вРуководство по эксплуатации Tikz-Pgf(страница 477). При желании можно установить другой якорь, добавив ключ anchor=northили anchor=north westв параметрах.

Круг будет работать так же, за исключением того, что якорь установлен в центре круга, а не на юге. Если вы измените свой пример, чтобы иметь \node at (1,1) [circle, draw] {over};, вы увидите, что он расположен точно в центре, но если вы добавите anchor=south, он будет перемещен вверх так, чтобы его юг совпадал с центром сетки.

решение2

Я думаю, что необходимо больше разъяснений. Во-первых, почему нет синтаксической ошибки. Это потому, что это экономит много синтаксиса if then. Проверьте внутренний код для этих опций в архаичном стиле \tikzoption(что эквивалентно \tikzset)

\tikzoption{above}[]{\def\tikz@anchor{south}\tikz@possibly@transform{y}{}{#1}}
\tikzoption{below}[]{\def\tikz@anchor{north}\tikz@possibly@transform{y}{-}{#1}}
\tikzoption{above left}[]%
  {\def\tikz@anchor{south east}%
    \tikz@possibly@transform{x}{-}{#1}\tikz@possibly@transform{y}{}{#1}}

Теперь вам не нужно знать, что он делает с возможным преобразованием и т. д. Но вы заметили, что если вы указываете выше, ниже и т. д., он отбрасывает информацию об x, даже если вы явно указываете 0,2 и 3 мм.

Также вы можете увидеть противоположную привязку в действии: вы выбираете одну опцию, и она выбирает противоположное направление компаса для привязки. Если вы хотите переопределить ее, вам нужно добавить explicit anchor=<foo>к вашим опциям.

Включив более мелкую сетку, вы сможете лучше увидеть позиционирование.

%\usetikzlibrary{positioning}
\begin{tikzpicture}
\draw [help lines] (0,0) grid[step=1mm] (2,2) node at (1,1) {o};
\node at (1,1) [circle,above=0.2 and 3mm, draw] {over};
\end{tikzpicture}

введите описание изображения здесь

А также с помощью правого верхнего угла вы получите точную величину сдвига

%\usetikzlibrary{positioning,shapes.geometric}
\begin{tikzpicture}
\draw [help lines] (0,0) grid[step=1mm] (2,2) node at (1,1) {o};
\node at (1,1) [ellipse,above right=0.2 and 3mm, draw] {over};
\fill[red] (1,1) ++(3mm,2mm) circle(0.5pt);
\end{tikzpicture}

введите описание изображения здесь

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