節點中多行文字的「緊密」填充

節點中多行文字的「緊密」填充

我需要用多行標籤來標記彎曲路徑。目前,我透過沿著路徑放置節點來實現此目的,如以下 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}

輸出

在此輸入影像描述

相關內容