Tengo varios bloques que deberían estar conectados al bloque "base" como en el diagrama UML con la flecha "extiende" (creé este ejemplo simplemente dibujando sin TeX):
Estoy tratando de hacerlo usando este código con |-
una línea común para las flechas y (270:10mm)
moverlo hacia abajo para 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}
pero me sale esta foto:
¿Cómo unir correctamente varias flechas con una línea común? Lo más probable es que necesite cambiar la cantidad de bloques y su posición, por lo que las coordenadas de línea fijas o codificadas no funcionarán para mí.
Respuesta1
Haría así, con arrows
la biblioteca 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}
Editar:No es un gran problema, pero si amplía la flecha verá que las conexiones que provienen de los nodos izquierdo y derecho (que no tienen flecha) cambian la imagen de la punta de la flecha. Vea abajo.
Entonces, en este caso, simplemente mueva un poco hacia abajo el punto final de las conexiones con ([yshift=-1pt]base.south)
, por ejemplo, para que el borde no toque el marco y la punta de la flecha quede más afilada.
\draw (impl1.north) |- (270:10mm) -| ([yshift=-1pt]base.south);
\draw[-latex] (impl2.north) -- (base.south);
\draw (impl3.north) |- (270:10mm) -| ([yshift=-1pt]base.south);
Respuesta2
Esto es lo que propongo. Se define un nodo n
de forma coordinate
"en la encrucijada" para que el código sea fácil de leer. La flecha especial se realiza con el siguiente estilo, que se basa en el arrows.meta
TikBiblioteca Z:
extends/.style={->, >={Triangle[open, width=0.2cm, length=0.2cm]}}
Tenga en cuenta que \tikzstyle
está en desuso. Úselo block/.style={...}
para definir el block
estilo (ver más abajo). outer sep=0
en mi block
estilo garantiza que las líneas de conexión no se detengan antes del borde del rectángulo. Eliminé la opción auto
porque no se usa aquí.
\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}
Respuesta3
Su diagrama me deja en un árbol con la dirección de la flecha opuesta:
Se puede dibujar de forma sencilla mediante el uso del forest
paquete con la opción 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}