여러 노드에서 하나로 화살표를 그리고 공통 선으로 연결합니다.

여러 노드에서 하나로 화살표를 그리고 공통 선으로 연결합니다.

"확장" 화살표가 있는 UML 다이어그램과 같이 "기본" 블록에 연결되어야 하는 여러 블록이 있습니다. (저는 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

나는 TikZ 라이브러리를 사용하여 이렇게 하고 싶습니다 arrows.

여기에 이미지 설명을 입력하세요

\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.metaTi 에 의존하는 다음 스타일로 수행됩니다.케이Z 라이브러리:

extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}}

더 이상 \tikzstyle사용되지 않습니다. 스타일 block/.style={...}을 정의하는 데 사용합니다 block(아래 참조). outer sep=0block스타일에서는 연결선이 직사각형 테두리 앞에서 멈추지 않도록 합니다. 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}

관련 정보