"Enge" Füllung von mehrzeiligem Text im Knoten

"Enge" Füllung von mehrzeiligem Text im Knoten

Ich muss gekrümmte Pfade mit mehrzeiligen Beschriftungen versehen. Derzeit mache ich das, indem ich Knoten entlang der Pfade platziere, wie im folgenden 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}

was gibt

Bildbeschreibung hier eingeben

Normalerweise verwende ich fill=white, aber hier habe ich Gelb verwendet, um das Problem deutlicher zu machen: Der Knoten ist so breit wie die längste Linie, was bedeutet, dass ein Teil der Linie durch die Beschriftung verdeckt wird.

Was ich stattdessen möchte, ist, dass nur der unmittelbare Hintergrund des Textes gefüllt wird. Bei mehrzeiligem Text würde das bedeuten, dass die Füllung nicht von der Breite der breitesten Zeile abhängt, sondern dass sich die Füllung an die Breite jeder einzelnen Zeile anpasst, also „eng“ ist. Ich weiß nicht, wie man das auf elegante Weise mit machen kann TikZ, aber dieses MWE zeigt etwas, das dem nahe kommt, was ich will:

\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}

ergebend:

Bildbeschreibung hier eingeben

Dies bringt mindestens zwei Probleme mit sich:

  • Zwischen den beiden Zeilen befindet sich ein weißer Zwischenraum. Ich könnte ihn beseitigen, indem ich die Beschriftungen manuell verschiebe, aber das ist mühsam und der Abstand zwischen den Zeilen würde nicht unbedingt dem üblichen Zeilenabstand entsprechen.
  • Ich muss das Etikett manuell platzieren, anstatt es wie im ersten MWE entlang des Pfads platzieren zu können.

Was ist eine gute Lösung, um diese Probleme zu umgehen?

Antwort1

Bildbeschreibung hier eingeben

\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}

Sie können auch erwägen, den Pfad oben zu zeichnen

Bildbeschreibung hier eingeben

\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}

Antwort2

Ich findeDavid CarlisleDie Lösung von ist bereits sehr gut, da eine neue (mehrteilige) Form benötigt wird, damit nur der Text und nicht das gesamte Rechteck ausgefüllt wird, es aber dennoch als ein Knoten fungieren soll.

Wenn der Knoten nicht geneigt (entlang des Pfads gedreht) werden muss, können Sie eine matrix(Anzahl von Knoten) verwenden.

Beachten Sie, dass Sie hier ein Ende benötigen \\. Wir könnten auch ein Bild definieren, bei dem das letzte \\ nicht erforderlich ist, aber die Syntax benötigt wird

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

Code

\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}

Ausgabe

Bildbeschreibung hier eingeben

verwandte Informationen