Necesito etiquetar caminos curvos con etiquetas de varias líneas. Actualmente, hago esto colocando nodos a lo largo de las rutas como en el siguiente 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}
lo que da
Normalmente uso fill=white
, pero aquí he usado amarillo para aclarar el problema: el nodo es tan ancho como la línea más larga, lo que significa que parte de la línea está oscurecida por la etiqueta.
En cambio, lo que quiero es que solo se rellene el fondo inmediato del texto. Para texto de varias líneas, esto significaría que el relleno no depende del ancho de la línea más ancha, sino que el relleno se ajustaría al ancho de cada línea individual, es decir, sería "apretado". No sé cómo hacer esto de manera elegante TikZ
, pero este MWE muestra algo parecido a lo que quiero:
\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}
Resultando en:
Hay al menos dos problemas con esto:
- Hay un espacio en blanco entre las dos líneas. Podría deshacerme de él moviendo las etiquetas manualmente, pero esto es tedioso y el espacio entre líneas no necesariamente sería consistente con el espacio entre líneas habitual.
- Necesito colocar la etiqueta manualmente en lugar de poder colocarla a lo largo del camino como en el primer MWE.
¿Cuál es una buena solución que evite estos problemas?
Respuesta1
\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}
También podrías considerar dibujar el camino en la parte superior.
\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}
Respuesta2
CreoDavid CarlisleLa solución de ya es muy buena porque se necesita una nueva forma (de varias partes) para llenar solo el texto y no todo el rectángulo y al mismo tiempo actuar como un nodo.
Si no necesita que el nodo esté inclinado (girado a lo largo del camino), puede usar un matrix
(de nodos).
Tenga en cuenta que necesita un final \\
aquí. También podríamos definir una imagen donde la última \\
no será necesaria pero sí la sintaxis.
pic [<options>] {multiline = short line \\ much longer line}
Código
\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}