Quero criar um diagrama no tikz usando algo como o seguinte 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}
Existem 3 problemas:
- Quero que os três nós ,,
n1
todos tenham a mesma altura, sem precisar adivinhar a altura ideal usandon2
n3
minimum height
- Quero que o nó longo se ajuste à largura dos outros três nós, mas a altura do
long
nó deve ser automática de acordo com o texto nele contido - O texto
long
deve estar centralizado verticalmente, mas aqui não é
Alguém tem uma boa solução para isso?
Responder1
Use fit
também para n3
e label=center:text
para texto em nós n3
e 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}
Atualizar:
Caso queira ajustar a altura do long
nó, uma solução parcial poderia 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")}
] {};
novas fit
opções e inner xsep=0
define sua dimensão longitudinal e altura mínima={height("long")} (da calc
tikzlibrary) define a vertical.
Outra solução para nós com conteúdos mais altos poderia ser utilizar um nó auxiliar que fixa a altura e um fit
nó que a cobre. O nó auxiliar pode ser criado com:
\node (aux) [above = 1cm of n1.west, anchor=south west, fill=red!30] {long\\long\\long};
É um nó regular que é colocado onde queremos ( above = 1cm of n1.west, anchor=south west
) e com tamanho ajustado para conter seu texto.
Agora podemos usar suas âncoras para definir o novo nó desde os anteriores n1, n2 e n3 e ajustar a altura ao seu conteúdo.
\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 você pode ver fit = {(n1.west|-aux.south)(n3.east|-aux.north)}
e inner sep=-.5\pgflinewidth
definir o tamanho do nó de notícias.
E opacity=.5
foi incluído para ver também aux
o node. Comente esta linha ou exclua-a antes de produzir o resultado final.
Todos os nós de ajuste no código a seguir incluem inner sep=-.5\pgflinewidth
. Dessa forma, fit
os nós terão o tamanho exato dos referenciados. Com inner sep=0pt
, os nós de ajuste incluem âncoras de referência dentro de suas bordas, o que significa que os nós resultantes têm meia largura de linha maior que os ajustados.
O código completo é:
\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}