节点中多行文本的“紧密”填充

节点中多行文本的“紧密”填充

我需要用多行标签标记弯曲路径。目前,我通过沿路径放置节点来实现此目的,如以下 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 [<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}

输出

在此处输入图片描述

相关内容