Масштабируйте ширину узла, чтобы подогнать его под текст, сохраняя максимальную ширину.

Масштабируйте ширину узла, чтобы подогнать его под текст, сохраняя максимальную ширину.

Моя проблема на самом делекажетсяпросто, так что извините, если на этот вопрос уже был дан ответ, я не смог его найти. Возможно, я также неправильно указал ключевые слова.

Текущая ситуация:

\tikzstyle{block} = [rectangle, draw, fill=blue!20, text width=15em, text centered, rounded corners, minimum height=5em]

Здесь ширина текста была увеличена до 15em, поскольку ранее узлы переносили текст так быстро, что график не помещался на одной странице и элементы начинали перекрываться.

В моем случае использования я хочу иметь три вертикальных графика рядом друг с другом, поэтому важно также, чтобы tikz соблюдал директиву максимальной ширины. Я не могу использовать text width=15em(или 0.3\textwidth) как есть, потому что когда текст короткий, сам узел все еще остается в своей ширине.

Так что по сути я хочу узел, который: Если ниже максимальной ширины, то он изменяет размер в соответствии с длиной текста, в противном случае он начнет перенос текста. Также, если это возможно без особых усилий, разрешите устанавливать эту ширину, например так:

\begin{figure}[htbp]
    \centering
    \begin{tikzpicture}[node distance = 2cm, auto, maximum-width=0.3\textwidth]
...

или что-то подобное, но желательно не в определении стиля и не в каждом отдельном \node.

Заранее спасибо за любую помощь :)

решение1

Я не думаю, что есть простой ключ, который делает это, но есть что-то близкое к этому. Этот ответ определяет стиль max width node, который принимает аргументы формы max width node={[<style>]{content}}, с примерами в следующем MWE:

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{calc}
\tikzset{max width node/.style args={[#1]#2}{insert path={
node[#1,opacity=0,overlay](tst){#2}
let \p1=($(tst.east)-(tst.west)$),
    \n1={ifthenelse(\x1>\pgfkeysvalueof{/tikz/max width},1,0)}
in
\ifdim\n1>0pt
  node[#1,text width=\pgfkeysvalueof{/tikz/max width}-4pt]{#2}
\else
  node[#1]{#2}
\fi
}},max width/.initial=5em}
\begin{document}
\begin{tikzpicture}[block/.style={rectangle, draw, fill=blue!20, text centered, rounded corners, minimum height=5em}]
 \path (0,0) [max width node={[block]{pft}}]
  (0,-5) [max width node={[block]{pft pft pft pft pft pft pft pft pft pft
  pft pft pft pft pft pft pft pft pft pft 
  pft pft pft pft pft pft pft pft pft pft}}];
 \path (5,0) [max width node={[block,max width=7em]{pft}}]
  (5,-5) [max width node={[block,max width=7em]{pft pft pft pft pft pft pft pft pft pft
  pft pft pft pft pft pft pft pft pft pft 
  pft pft pft pft pft pft pft pft pft pft}}];
\end{tikzpicture}
\end{document}

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

Обратите внимание, что \tikzstyleэтот метод устарел, и обычно к вопросам прилагаются минимальные рабочие примеры.

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