Я хочу создать диаграмму в 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 проблемы:
n1
Я хочу ,n2
чтобы все три узлаn3
имели одинаковую высоту, без необходимости угадывать оптимальную высоту с помощьюminimum height
- Я хочу, чтобы длинный узел соответствовал ширине трех других узлов, но высота узла
long
должна быть автоматической в соответствии с текстом в нем. - Текст
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")} (из calc
tikzlibrary) определяет вертикаль.
Другим решением для узлов с более высоким содержимым может быть использование вспомогательного узла, который фиксирует высоту, и 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}