В чем разница между xshift/yshift и относительными координатами при рисовании стрелки между узлами?

В чем разница между xshift/yshift и относительными координатами при рисовании стрелки между узлами?

Вчера вечером я создал этот фрагмент LaTeX, используя относительные координаты для соединения узлов стрелками:

\documentclass[a4paper,10pt]{article}

\usepackage{tikz}
\usetikzlibrary{positioning} %for [above], [below] and shit.
\usetikzlibrary{arrows}
\usetikzlibrary{shapes}

\begin{document}
    \begin{figure}[generic_scheme]
        \tikzstyle{block}=[draw,shape=rectangle, minimum width=2.5cm,
            minimum height=1cm]
        \tikzstyle{f_arrow}=[->, thick]
        \tikzstyle{d_arrow}=[<->, thick]
        \begin{tikzpicture}[auto]
            \node[block] (nuc) [] {Intel NUC};
            \node[block] (power) [above=of nuc, yshift=0.5cm]
                {Power\\Circuit};
            \node[block] (smps) [left=of nuc, yshift=1.25cm] {SMPS};

            \draw[f_arrow] (power.south) -- (nuc.north);
            \draw[f_arrow] (power.west)++(0, -0.25) --
                (smps.east)++(0, 0.25);
            \draw[d_arrow] (nuc.west)++(0, 0.25) --
                (smps.east)++(0, -0.25);
        \end{tikzpicture}
    \end{figure}
\end{document}

Результат оказался несколько озадачивающим: Линии, использующие относительные координаты между узлами

Сегодня я попробовал этот альтернативный способ, используя yshiftвместо относительных координат:

\documentclass[a4paper,10pt]{article}

\usepackage{tikz}
\usetikzlibrary{positioning} %for [above], [below] and shit.
\usetikzlibrary{arrows}
\usetikzlibrary{shapes}

\begin{document}
    \begin{figure}[generic_scheme]
        \tikzstyle{block}=[draw,shape=rectangle, minimum width=2.5cm,
            minimum height=1cm]
        \tikzstyle{f_arrow}=[->, thick]
        \tikzstyle{d_arrow}=[<->, thick]
        \begin{tikzpicture}[auto]
            \node[block] (nuc) [] {Intel NUC};
            \node[block] (power) [above=of nuc, yshift=0.5cm]
                {Power\\Circuit};
            \node[block] (smps) [left=of nuc, yshift=1.25cm] {SMPS};

            \draw[f_arrow] (power.south) -- (nuc.north);
            \draw[f_arrow] ([yshift=-0.25cm]power.west) --
                ([yshift=0.25cm]smps.east);
            \draw[d_arrow] ([yshift=0.25cm]nuc.west) --
                ([yshift=-0.25cm]smps.east);
        \end{tikzpicture}
    \end{figure}
\end{document}

Что сработало так, как и предполагалось: Линии, использующие yshift между узлами.

Итак, мой вопрос: в чем разница между этими, на первый взгляд "идентичными" частями LaTeX? Я упускаю что-то тривиальное, пытаясь понять, как работает relative coordinateи yshift? Или это просто ошибка в моей стандартной Ubuntu 14.04установке pdfTeX 3.1415926-2.5-1.40.14?

решение1

Проблема здесь в том, что использование

\draw[d_arrow] (nuc.west)++(0, 0.25) --
                (smps.east)++(0, -0.25);

тынетприбавление/вычитание 0,25 из координат без изменения пути. Вы перемещаете карандаш, как показывает следующий простой пример (посмотрите, где заканчивается линия в обоих случаях и где получается кончик стрелки):

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\draw (0,0) grid (6,3);
\draw (0,0)++(0.5,0.5) -- (2,2)++(0.5,0.5);
\draw[->] (3,0)++(0.5,0.5) -- (5,2)++(0.5,0.5);
\end{tikzpicture}
\end{document}

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

Последовательность

\draw[->] (3,0)++(0.5,0.5) -- (5,2)++(0.5,0.5);

можно рассматривать как:

  • Переместите карандаш в точку (3,0).
  • Переместите его (но без рисования) дополнительно на 0,5 по координатам x и y.
  • Начните рисовать до (5,2).
  • Снова переместите карандаш еще на 0,5 по обеим координатам (но теперь рисунка нет).
  • Поместите наконечник(и) стрелы.

Если вы хотите добавить значения, используйте сдвиги или calcбиблиотеку (возможно, здесь это излишне):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
\draw (0,0) grid (6,3);
\draw[->] ([shift={(0.5,0.5)}]0,0) -- ([shift={(0.5,0.5)}]2,2);
\draw[->] ( $ (3,0) +(0.5,0.5) $ ) -- ( $ (5,2) + (0.5,0.5) $ );
\end{tikzpicture}
\end{document}

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

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