ノード内の複数行テキストの「タイトな」充填

ノード内の複数行テキストの「タイトな」充填

曲線のパスに複数行のラベルを付ける必要がある。現在、次の 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}

その結果:

ここに画像の説明を入力してください

これには少なくとも 2 つの問題があります。

  • 2 行の間には空白があります。ラベルを手動で移動すればこの空白をなくすことができますが、これは面倒な作業であり、行間の間隔が通常の行間隔と必ずしも一致するとは限りません。
  • 最初の 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

私は思うデビッド・カーライルのソリューションは、すでに非常に優れたものです。四角形全体ではなくテキストのみを塗りつぶし、それを 1 つのノードとして機能させるには、新しい (複数部分から成る) 図形が必要になるためです。

ノードを傾斜させる(パスに沿って回転させる)必要がない場合は、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}

出力

ここに画像の説明を入力してください

関連情報