Ich habe mehrere Blöcke, die wie im UML-Diagramm mit dem „Erweitert“-Pfeil mit dem „Basis“-Block verbunden werden sollten (ich habe dieses Beispiel nur durch Zeichnen ohne TeX erstellt):
Ich versuche, dies mit diesem Code zu tun, indem ich |-
eine gemeinsame Linie für Pfeile verwende und (270:10mm)
sie nach unten verschiebe für 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}
aber ich bekomme dieses Bild angezeigt:
Wie verbinde ich mehrere Pfeile richtig mit einer gemeinsamen Linie? Höchstwahrscheinlich muss ich die Anzahl der Blöcke und ihre Position ändern, daher funktionieren feste oder hartcodierte Linienkoordinaten für mich nicht.
Antwort1
Ich würde es so machen, mit arrows
der TikZ-Bibliothek.
\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}
Bearbeiten:Es ist kein großes Problem, aber wenn Sie den Pfeil vergrößern, werden Sie sehen, dass die Verbindungen von den linken und rechten Knoten (die keinen Pfeil haben) die Darstellung der Pfeilspitze verändern. Siehe unten.
Verschiebe in diesem Fall einfach die Endpunkte der Verbindungen beispielsweise mit etwas nach unten ([yshift=-1pt]base.south)
, damit die Kante den Rahmen nicht berührt und die Pfeilspitze schärfer wird.
\draw (impl1.north) |- (270:10mm) -| ([yshift=-1pt]base.south);
\draw[-latex] (impl2.north) -- (base.south);
\draw (impl3.north) |- (270:10mm) -| ([yshift=-1pt]base.south);
Antwort2
Hier ist mein Vorschlag. Ein Knoten n
der Form coordinate
„an der Kreuzung“ wird definiert, um den Code leicht lesbar zu machen. Der spezielle Pfeil wird mit dem folgenden Stil erstellt, der auf dem arrows.meta
Ti basiertkZ-Bibliothek:
extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}}
Beachten Sie, dass dies \tikzstyle
veraltet ist. Verwenden Sie es, block/.style={...}
um den block
Stil zu definieren (siehe unten). outer sep=0
In meinem block
Stil wird sichergestellt, dass Verbindungslinien nicht vor dem Rechteckrand enden. Ich habe die Option entfernt, auto
da sie hier nicht verwendet wird.
\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}
Antwort3
Ihr Diagramm lässt mich an einem Baum mit entgegengesetzter Pfeilrichtung hängen:
Es kann einfach durch Verwendung des forest
Pakets mit der Option gezeichnet werden 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}