
Может быть, этот вопрос наивен, но когда мне нужно будет использовать edge
вместо --
?, и как я могу использовать edge
для копирования того же вывода команды path Conventional Draw --
?
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows,positioning,shapes.geometric,calc}
\begin{document}
\begin{tikzpicture}[>=latex',very thick,align=center]
\tikzset{%
block/.style= {draw, rectangle, text width=2cm,minimum height=1cm,align=center}
}
\node [block] (start1) {Start1};
\node [block, right = 1cm of start1.east] (end1) {End1};
\node [block, below= 2cm of start1] (start2) {Start2};
\node [block, right = 1cm of start2] (end2) {End2};
\path[draw,->]
(start1.north) -- ++(0,1cm) -- ++(3.25cm,0) -- (end1.north);
\path[draw,->]
(start2.north) edge ++(0,1cm) edge ++(3.25cm,0) edge (end2.north);
\end{tikzpicture}
\end{document}
решение1
Этот ответ не претендует на то, чтобы охватить все детали, а скорее дает «первоначальное» объяснение некоторых различий.
edge
создает отдельный путь, который может иметь совершенно другие атрибуты, чем основной путь. В отличие от точек на основном пути, ребро никуда не движется.
На самом деле это не то, что происходит, но это такбудтоБывает:
Предположим, мы начинаем с пути
\path [draw=blue, -{Stealth[]}] (0,0)
.- Пока что мы никуда не ушли. Мы сказали, что этот путь должен быть нарисован и что он должен иметь определенный наконечник стрелки. Мы переместились в начало пути.
Итак, продолжим
++(1,0)
.- Это переместит нас на 1 единицу вправо, по-прежнему ничего не рисуя.
Теперь добавляем
-- ++(1,0)
.- Это перемещает нас еще на 1 вправо, и на этот раз путь нарисован. Если мы поставим
;
здесь, то получим наконечник стрелы здесь. Но мы этого не делаем, поэтому наконечник пока не нужен.
- Это перемещает нас еще на 1 вправо, и на этот раз путь нарисован. Если мы поставим
Теперь, вместо того, чтобы продолжать основной путь, мы добавляем
edge ++(0,1}
.- Мы можем думать о TikZ как о временном останове строительства основного пути и отвлечении, чтобы сделать небольшой боковой путь. Этот путь идет от нашей текущей позиции вверх на 1 единицу. По умолчанию он наследует атрибуты основного пути, поэтому он синий со стрелкой. Когда операция
edge
завершена, TikZ возвращается в точку, в которой он начал отклонение. Это как заскочить в переулок, чтобы забрать немного хлеба из булочной по пути, чтобы забрать детей из школы. Как только вы получите хлеб, вы возвращаетесь на главную улицу, чтобы продолжить путь в школу.
- Мы можем думать о TikZ как о временном останове строительства основного пути и отвлечении, чтобы сделать небольшой боковой путь. Этот путь идет от нашей текущей позиции вверх на 1 единицу. По умолчанию он наследует атрибуты основного пути, поэтому он синий со стрелкой. Когда операция
Теперь мы дополняем
-- ++(1,0)
наш путь.- Итак, раз уж мы вернулись с объезда, то продолжим движение по прямой вправо.
Далее добавляем
edge [draw=red, -{Circle[fill=green]}] ++(0,1)
.- Это еще один отвлекающий маневр, но на этот раз мы рисуем край красным и меняем наконечник стрелки. Это касается только нашего отвлекающего маневра, конечно.
- Обратите внимание, что это невозможно с обычным контуром — например, вы не можете сделать часть его красной, а часть синей, но он
edge
может иметь совершенно разные атрибуты от основного контура и от любого другого контура,edge
нарисованного в рамках той же\path
команды.
Наконец, мы завершаем путь с помощью
-- ++(1,0);
.
Полный код:
\documentclass[tikz,border=10pt,multi]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}[x=25mm, y=25mm, line width=1pt]
\path [draw=blue, -{Stealth[]}] (0,0) ++(1,0) -- ++(1,0) edge ++(0,1) -- ++(1,0) edge [draw=red, -{Circle[fill=green]}] ++(0,1) -- ++(1,0);
\foreach \i/\j in {(0,0)/{(0,0)},(1,0)/{++(1,0)},(2,0)/{++(1,0)},(3,0)/{++(1,0)},(4,0)/{++(1,0)}} \path \i node [below, ] {\j};
\foreach \i/\j in {(2,1)/{++(0,1)},(3,1)/{++(0,1)}} \path \i node [right, ] {\j};
\end{tikzpicture}
\end{document}
Относительно МВЭ
В случае примера, приведенного в вопросе, вы, конечно, можете просто написать
\documentclass[tikz,border=10pt,multi]{standalone}
\usetikzlibrary{arrows.meta,positioning}
\begin{document}
\begin{tikzpicture}
[
>=Latex,
very thick,
align=center,
block/.style= {draw, rectangle, text width=2cm,minimum height=1cm,align=center},
]
\node [block] (start1) {Start1};
\node [block, right = 1cm of start1.east] (end1) {End1};
\node [block, below= 2cm of start1] (start2) {Start2};
\node [block, right = 1cm of start2] (end2) {End2};
\path [draw, ->] (start1.north) -- ++(0,1cm) -- ++(3.25cm,0) -- (end1.north);
\path [draw, ->] (start2.north) -- ++(0,1cm) -- ++(3.25cm,0) -- (end2.north);
\end{tikzpicture}
\end{document}
производить
Однако я полагаю, что вы хотели бы узнать, как сделать это все в одном.
Команды node и path, указанные выше, можно заменить следующими двумя путями:
\path [draw, ->] node [block] (start1) {Start1} (start1.north) |- ++(3.25cm,1cm) node [block, right=1cm of start1] (end1) {End1} -- (end1);
\path [draw, ->] node [block, below= 2cm of start1] (start2) {Start2} (start2.north) |- ++(3.25cm,1cm) node [block, right=1cm of start2] (end2) {End2} -- (end2);
которые производят идентичный результат, или, более кратко, но менее очевидно, с
\coordinate (start0);
\foreach \i [evaluate=\i as \j using int(\i-1), evaluate=\j as \k using \j*2] in {1,2}
\path [draw, ->] node [block, below=\k cm of start\j] (start\i) {Start\i} (start\i.north) |- ++(3.25cm,1cm) node [block, right=1cm of start\i] (end\i) {End\i} -- (end\i);