我需要用多行标签标记弯曲路径。目前,我通过沿路径放置节点来实现此目的,如以下 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}