我需要用多行標籤來標記彎曲路徑。目前,我透過沿著路徑放置節點來實現此目的,如以下 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}