tikz: подгонка ширины узла, но автоматическая высота

tikz: подгонка ширины узла, но автоматическая высота

Я хочу создать диаграмму в tikz, используя следующий код:

\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}

введите описание изображения здесь

Есть 3 проблемы:

  1. n1Я хочу , n2чтобы все три узла n3имели одинаковую высоту, без необходимости угадывать оптимальную высоту с помощьюminimum height
  2. Я хочу, чтобы длинный узел соответствовал ширине трех других узлов, но высота узла longдолжна быть автоматической в ​​соответствии с текстом в нем.
  3. Текст longдолжен быть выровнен по вертикали, но здесь это не так.

Есть ли у кого-нибудь хорошее решение этой проблемы?

решение1

Используйте fitтакже для n3и label=center:textдля текста в узлах n3и 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}

введите описание изображения здесь

Обновлять:

Если вы хотите отрегулировать высоту longузла, частичным решением может быть:

\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")}
        ] {};

новые fitпараметры и inner xsep=0определяют его продольный размер, а минимальная высота height={height("long")} (из calctikzlibrary) определяет вертикаль.

Другим решением для узлов с более высоким содержимым может быть использование вспомогательного узла, который фиксирует высоту, и fitузла, который ее покрывает. Вспомогательный узел может быть создан с помощью:

\node (aux) [above = 1cm of n1.west, anchor=south west, fill=red!30] {long\\long\\long};

Это обычный узел, который размещается там, где мы хотим ( above = 1cm of n1.west, anchor=south west), и имеет настроенный размер, чтобы вместить текст.

Теперь мы можем использовать его якоря для определения нового узла, равного предыдущим n1, n2 и n3, и отрегулировать высоту в соответствии с его содержимым.

\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}, 
          ] {};

Как вы можете видеть fit = {(n1.west|-aux.south)(n3.east|-aux.north)}и inner sep=-.5\pgflinewidthопределять размер узла новостей.

И opacity=.5был включен, чтобы также увидеть auxузел. Закомментируйте эту строку или удалите ее перед получением окончательного результата.

Все подходящие узлы в следующем коде включают inner sep=-.5\pgflinewidth. Таким образом, fitузлы будут иметь точный размер ссылочных узлов. С inner sep=0pt, подходящие узлы включают ссылочные якоря внутри своих границ, что означает, что полученные узлы на половину ширины линии больше, чем подогнанных.

Полный код:

\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}

введите описание изображения здесь

Связанный контент