Preciso rotular caminhos curvos com rótulos multilinhas. Atualmente, faço isso colocando nós ao longo dos caminhos como no seguinte 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}
que dá
Normalmente eu uso fill=white
, mas aqui usei amarelo para deixar o problema mais claro: O nó é tão largo quanto a linha mais longa, o que significa que parte da linha está obscurecida pelo rótulo.
O que eu quero é que apenas o plano de fundo imediato do texto seja preenchido. Para texto multilinha, isso significaria que o preenchimento não depende da largura da linha mais larga, mas que o preenchimento se ajustaria à largura de cada linha individual, ou seja, seria "apertado". Não sei como fazer isso de forma elegante com TikZ
, mas esse MWE mostra algo próximo do que desejo:
\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 em:
Existem pelo menos dois problemas com isso:
- Há um espaço em branco entre as duas linhas. Eu poderia me livrar disso movendo os rótulos manualmente, mas isso é tedioso e o espaçamento entre as linhas não seria necessariamente consistente com o espaçamento normal entre linhas.
- Preciso colocar o rótulo manualmente em vez de poder colocá-lo ao longo do caminho como no primeiro MWE.
Qual é uma boa solução que contorna esses problemas?
Responder1
\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}
Você também pode considerar desenhar o caminho no topo
\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}
Responder2
Eu pensoDavid CarlisleA solução de já é muito boa porque é necessária uma nova forma (com várias partes) para que apenas o texto seja preenchido e não o retângulo inteiro, enquanto ainda funciona como um nó.
Se você não precisa que o nó seja inclinado (girado ao longo do caminho), você pode usar um matrix
(de nós).
Observe que você precisa de um final \\
aqui. Também poderíamos definir uma foto onde a última \\
não será necessária, mas precisará da sintaxe
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}