tikz: ajustando a largura do nó, mas a altura automática

tikz: ajustando a largura do nó, mas a altura automática

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}

insira a descrição da imagem aqui

Existem 3 problemas:

  1. Quero que os três nós ,, n1todos tenham a mesma altura, sem precisar adivinhar a altura ideal usandon2n3minimum height
  2. Quero que o nó longo se ajuste à largura dos outros três nós, mas a altura do longnó deve ser automática de acordo com o texto nele contido
  3. O texto longdeve estar centralizado verticalmente, mas aqui não é

Alguém tem uma boa solução para isso?

Responder1

Use fittambém para n3e label=center:textpara texto em nós n3e 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}

insira a descrição da imagem aqui

Atualizar:

Caso queira ajustar a altura do longnó, 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 fitopções e inner xsep=0define sua dimensão longitudinal e altura mínima={height("long")} (da calctikzlibrary) 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 fitnó 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\pgflinewidthdefinir o tamanho do nó de notícias.

E opacity=.5foi incluído para ver também auxo 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, fitos 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}

insira a descrição da imagem aqui

informação relacionada