У меня есть несколько блоков, которые должны быть соединены с «базовым» блоком, как на диаграмме UML, с помощью стрелки «extends» (я создал этот пример, просто нарисовав его без TeX):
Я пытаюсь сделать это, используя этот код с |-
общей линией для стрелок и (270:10mm)
переместить ее вниз 10mm
:
\tikzset{node distance=1.6cm, auto, every text node part/.style={align=center, font={\sffamily\small}}}
\tikzstyle{block} = [draw=myblack, fill=white, inner sep=0.3cm, outer sep=0.1cm, thick]
\begin{tikzpicture}
\node[block] (base) {Base};
\node[block, below=of base] (impl2) {Impl2};
\node[block, left=of impl2] (impl1) {Impl1};
\node[block, right=of impl2] (impl3) {Impl3};
\draw[->] (impl1.north) |- (270:10mm) --++ (base.south);
\draw[->] (impl2.north) |- (270:10mm) --++ (base.south);
\draw[->] (impl3.north) |- (270:10mm) --++ (base.south);
\end{tikzpicture}
но у меня получается такая картина:
Как правильно соединить несколько стрелок общей линией? Скорее всего, мне нужно будет изменить количество блоков и их положение, поэтому фиксированные или жестко заданные координаты линии мне не подойдут.
решение1
Я бы сделал так, с arrows
библиотекой TikZ.
\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{chains,arrows}
\tikzset{
node distance=1.6cm,
auto,
every text node part/.style={
align=center,
font={\sffamily\small},
}
}
\tikzstyle{block}=[
draw=black,
fill=white,
inner sep=0.3cm,
outer sep=0cm,
thick,
]
\begin{document}
\begin{tikzpicture}
\node[block] (base) {Base};
\node[block, below=of base] (impl2) {Impl2};
\node[block, left= of impl2] (impl1) {Impl1};
\node[block, right=of impl2] (impl3) {Impl3};
\draw (impl1.north) |- (270:10mm) -| (base.south);
\draw[-latex] (impl2.north) -- (base.south);
\draw (impl3.north) |- (270:10mm) -| (base.south);
\end{tikzpicture}
\end{document}
Редактировать:Это не большая проблема, но если вы увеличите масштаб стрелки, то увидите, что соединения, идущие от левого и правого узлов (на котором нет стрелки), изменяют визуальный вид кончика стрелки. Смотрите ниже.
Поэтому в этом случае просто сдвиньте немного вниз конечную точку соединений ([yshift=-1pt]base.south)
, например, так, чтобы край не касался рамки, а наконечник стрелы стал острее.
\draw (impl1.north) |- (270:10mm) -| ([yshift=-1pt]base.south);
\draw[-latex] (impl2.north) -- (base.south);
\draw (impl3.north) |- (270:10mm) -| ([yshift=-1pt]base.south);
решение2
Вот что я предлагаю. Узел n
формы coordinate
определяется «на перекрестке», чтобы сделать код легко читаемым. Специальная стрелка сделана следующим стилем, который опирается на arrows.meta
TiкБиблиотека Z:
extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}}
Обратите внимание, что это \tikzstyle
устарело. Используйте block/.style={...}
для определения block
стиля (см. ниже). outer sep=0
в моем block
стиле гарантирует, что соединительные линии не останавливаются перед границей прямоугольника. Я удалил опцию, auto
потому что она здесь не используется.
\documentclass[tikz, border=2mm]{standalone}
\usetikzlibrary{arrows.meta, positioning}
\begin{document}
\begin{tikzpicture}[
node distance=1.6cm,
every text node part/.style={align=center, font={\sffamily\small}},
block/.style={draw=black, fill=white, inner sep=0.3cm, outer sep=0, thick},
extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}},
]
\node[block] (base) {Base} coordinate[below=0.7cm of base.south] (n);
\node[block, below=of base] (impl2) {Impl2};
\node[block, left=of impl2] (impl1) {Impl1};
\node[block, right=of impl2] (impl3) {Impl3};
\draw (impl1.north) |- (n);
\draw (impl2.north) |- (n);
\draw (impl3.north) |- (n);
\draw[extends] (n) -- (base.south);
\end{tikzpicture}
\end{document}
решение3
Ваша диаграмма оставляет меня на дереве с противоположным направлением стрелки:
Его можно просто нарисовать, используя пакет forest
с опцией forked edge
:
\documentclass[margin=3mm]{standalone}
\usepackage[edges]{forest}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{forest}
for tree = {
% nodes
draw,
inner sep = 3mm,
font = \sffamily\small,
% tree
forked edge,
l sep = 12mm, % vertical distances between nodes
fork sep = 6mm, % distances to connection point
s sep = 12mm, % horizontal distances between nodes
edge ={Stealth-}
}% end for tree
[Base
[Impl1]
[Impl2]
[Impl3]
]
\end{forest}
\end{document}