«Плотное» заполнение многострочного текста в узле

«Плотное» заполнение многострочного текста в узле

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

\documentclass[class=minimal,border=0pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}
  \draw[-] (-1,-0.5) .. controls (-1,1) and (1,0) .. 
    node[fill=yellow,above left=-20pt and -11pt,align=center] 
    {short line\\much longer line} (1,1);
\end{tikzpicture}
\end{document}

который дает

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

Обычно я использую fill=white, но здесь я использовал желтый цвет, чтобы сделать проблему более наглядной: ширина узла равна ширине самой длинной линии, что означает, что часть линии скрыта меткой.

Вместо этого я хочу, чтобы заполнялся только непосредственный фон текста. Для многострочного текста это означало бы, что заполнение зависело бы не от ширины самой широкой строки, а подстраивалось бы под ширину каждой отдельной строки, т. е. было бы "плотным". Я не знаю, как сделать это элегантно с помощью TikZ, но этот MWE показывает что-то близкое к тому, что я хочу:

\documentclass[class=minimal,border=0pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}
  \draw[-] (-1,-0.5) .. controls (-1,1) and (1,0) .. (1,1);
  \coordinate (L) at (-0.9,0.2);  
  \draw (L) node[fill=yellow,above=0pt,align=center] {short line};  
  \draw (L) node[fill=yellow,below=0pt,align=center] {much longer line};  
\end{tikzpicture}
\end{document}

в результате чего:

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

Здесь есть как минимум две проблемы:

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

Какое хорошее решение поможет обойти эти проблемы?

решение1

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

\documentclass[class=minimal,border=0pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
  \draw[-] (-1,-0.5) .. controls (-1,1) and (1,0) .. 
    node[above left=-20pt and -11pt,align=center] 
    {\colorbox{yellow}{short line}\\\colorbox{yellow}{much longer line}} (1,1);
\end{tikzpicture}
\end{document}

Вы также можете рассмотреть возможность нарисовать путь сверху.

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

\documentclass[class=minimal,border=0pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
  \draw[-] (-1,-0.5) .. controls (-1,1) and (1,0) .. 
    node[behind path, above left=-20pt and -11pt,align=center] 
    {\colorbox{yellow}{short line}\\\colorbox{yellow}{much longer line}} (1,1);
\end{tikzpicture}
\end{document}

решение2

Я думаюДэвид КарлайлРешение уже очень хорошее, поскольку нужна новая (составная) фигура, чтобы заполнить только текст, а не весь прямоугольник, и при этом он должен действовать как один узел.

Если вам не нужно, чтобы узел был наклонным (повернутым вдоль пути), вы можете использовать matrix(узлов).

Обратите внимание, что здесь вам нужно окончание \\. Мы также могли бы определить pic, где последнее \\ не будет необходимым, но будет нужен синтаксис

pic [<options>] {multiline = short line \\ much longer line}

Код

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning, matrix}
\tikzset{
  multiline/.style={
    matrix of nodes,
    every outer matrix/.append style={
      inner sep=+0pt, outer sep=+0pt, path only, shape=rectangle}}}
\begin{document}
\tikz
  \draw (-1,-0.5) .. controls (-1,1) and (1,0) ..
    node[
      multiline,
      above left = -20pt and -11pt,
      nodes={fill=yellow}
    ] {short line\\much longer line\\} (1,1);
\end{document}

Выход

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

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