Quiero crear un diagrama en tikz usando algo como el siguiente código:
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{positioning,fit}
\begin{document}
%\input{content/renalBrainshake/gfx/flowchart.tikz}
\begin{tikzpicture}[every node/.style={draw, fill=blue, font=\sffamily\tiny}, align=center, node distance = 2.1cm]
%%%%% COHORT NODES
%% DIABETICS
\node (n1) [] {node1\\ line 2};
\node (n2) [right of = n1] {node2\\ line 2};
\node (n3) [right of = n2] {node3};
\node (long)[fit = (n1)(n3),
above = 1cm of n1.west,
anchor= south west, inner sep=0] {long};
\end{tikzpicture}
\end{document}
Hay 3 problemas:
- Quiero que los tres nodos
n1
,n2
todosn3
tengan la misma altura, sin tener que adivinar la altura óptima usandominimum height
- Quiero que el nodo largo se ajuste al ancho de los otros tres nodos, pero la altura del
long
nodo debe ser automática según el texto que contiene. - El texto
long
debe estar centrado verticalmente, pero aquí no está
¿Alguien tiene una buena solución para algo de esto?
Respuesta1
Úselo fit
también para n3
y label=center:text
para texto en nodos n3
y long
.
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{positioning,fit}
\begin{document}
%\input{content/renalBrainshake/gfx/flowchart.tikz}
\begin{tikzpicture}[every node/.style={draw, fill=blue, font=\sffamily\tiny}, align=center, node distance = 2.1cm]
%%%%% COHORT NODES
%% DIABETICS
\node (n1) [] {node1\\ line 2};
\node (n2) [right of = n1] {node2\\ line 2};
\node (n3) [fit= (n2), inner sep=0pt, right of = n2, label=center:node3] {};
\node (long)[fit = (n1)(n3),
above = 1cm of n1.west,
anchor= south west, inner sep=0, label=center:long] {};
\end{tikzpicture}
\end{document}
Actualizar:
En caso de que desee ajustar la altura del long
nodo, una solución parcial podría ser:
\node (long)[fit = (n1.west)(n3.east),
above = 1cm of n1.west,
anchor= south west, inner xsep=0, label=center:{long},
minimum height={height("long")}
] {};
nuevas fit
opciones y inner xsep=0
define su dimensión longitudinal y altura mínima={height("long")} (de calc
tikzlibrary) define la vertical.
Otra solución para nodos con contenidos más altos podría ser utilizar un nodo auxiliar que fije la altura y un fit
nodo que la cubra. El nodo auxiliar se puede crear con:
\node (aux) [above = 1cm of n1.west, anchor=south west, fill=red!30] {long\\long\\long};
Es un nodo normal que se coloca donde queramos ( above = 1cm of n1.west, anchor=south west
) y con el tamaño ajustado para contener su texto.
Ahora podemos usar sus anclajes para definir el nuevo nodo siempre que los anteriores n1, n2 y n3 y ajustar la altura a su contenido.
\node (long)[fit = {(n1.west|-aux.south)(n3.east|-aux.north)},
above = 1cm of n1.west,
anchor= south west,
opacity = .5, %<--- delete this line in final figure
inner sep=-.5\pgflinewidth, label=center:{long\\ long\\ long},
] {};
Como puede ver fit = {(n1.west|-aux.south)(n3.east|-aux.north)}
y inner sep=-.5\pgflinewidth
definir el tamaño del nodo de noticias.
Y opacity=.5
se ha incluido para ver también aux
el nodo. Comente esta línea o elimínela antes de producir el resultado final.
Todos los nodos de ajuste en el siguiente código incluyen inner sep=-.5\pgflinewidth
. De esta forma, fit
los nodos tendrán el tamaño exacto de los referenciados. Con inner sep=0pt
, los nodos ajustados incluyen anclajes de referencia dentro de sus bordes, lo que significa que los nodos resultantes tienen un ancho de línea medio mayor que los ajustados.
El código completo es:
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{positioning,fit}
\begin{document}
%\input{content/renalBrainshake/gfx/flowchart.tikz}
\begin{tikzpicture}[every node/.style={draw, fill=blue!50, font=\sffamily\tiny}, align=center, node distance = 2.1cm]
%%%%% COHORT NODES
%% DIABETICS
\node (n1) [] {node1\\ line 2};
\node (n2) [right of = n1] {node2\\ line 2};
\node (n3) [fit= (n2), inner sep=-.5\pgflinewidth, right of = n2, label=center:node3] {};
\node (aux) [above = 1cm of n1.west, anchor=south west, fill=red!30] {long\\long\\long};
\node (long)[fit = {(n1.west|-aux.south)(n3.east|-aux.north)},
above = 1cm of n1.west,
anchor= south west,
opacity = .5,
inner sep=-.5\pgflinewidth, label=center:{long\\ long\\ long},
] {};
\end{tikzpicture}
\end{document}