我希望移动适合块左上角的标签,但现在它似乎位于中心。
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,calc}
\begin{document}
\begin{tikzpicture}[
box/.style={draw,minimum width=2.5cm,align=center},
node distance=0.5cm and 3cm
]
\node[box] (N1) {Source};
\node[box,below=of N1] (N2) {Destination};
\node[draw,dashed,inner sep=8pt,fit={(N1) (N2)}] (fit) {label};
\end{tikzpicture}
\end{document}
我希望使用相同的适合节点,但不想为了标签目的添加另一个节点!
答案1
可以将文本放在内部的左上角,而无需其他显式或隐式节点:
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,calc}
\makeatletter
\newcommand*{\MoveFitHeight}[1]{%
\pgfmathsetlengthmacro\fit@inner@sep{%
\pgfkeysvalueof{/pgf/inner xsep}%
}%
\pgfmathsetlengthmacro\fit@text@height{%
\tikz@text@height
}%
\kern-\fit@inner@sep\relax
\raisebox{\fit@text@height}[0pt][0pt]{#1}%
}
\makeatother
\begin{document}
\begin{tikzpicture}[
box/.style={draw,minimum width=2.5cm,align=center},
node distance=0.5cm and 3cm
]
\node[box] (N1) {Source};
\node[box,below=of N1] (N2) {Destination};
\node[
draw,
dashed,
inner sep=8pt,
fit={(N1) (N2)},
align=left,
] (fit) {\MoveFitHeight{label}};
\end{tikzpicture}
\end{document}
这文档说:
上面的意思是,一般来说,如果节点包含文本(如上例中的框),它将位于框内的中央。将文本放在其他地方会很困难,特别是更改节点的锚点不会产生预期的效果。相反,您应该做的是创建一个带有
fit
不包含任何文本的选项的节点,为其命名,然后使用普通节点在所需位置添加文本。或者,考虑使用label
或pin
选项。
我认为另一个节点是最干净的方式:
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,calc}
\begin{document}
\begin{tikzpicture}[
box/.style={draw,minimum width=2.5cm,align=center},
node distance=0.5cm and 3cm
]
\node[box] (N1) {Source};
\node[box,below=of N1] (N2) {Destination};
\node[
draw,
dashed,
inner sep=8pt,
fit={(N1) (N2)},
] (fit) {};
\node[above right, inner sep=0pt] at (fit.north west) {above right};
\node[below right, inner sep=0pt] at (fit.north west) {below right};
\end{tikzpicture}
\end{document}
inner sep
可以通过选项、xshift
或进行微调yshift
。
答案2
对于那些感兴趣的人,这里有一个使用 MetaPost 的快捷方法。
\documentclass[border=2mm]{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
input boxes
beginfig(1);
boxit.main(image(
label(btex \framebox[2.5cm]{Source} etex, origin);
label(btex \framebox[2.5cm]{Destination} etex, (0, -cm))));
main.dx = main.dy = 12pt;
drawunboxed(main); draw bpath(main) dashed evenly;
label.lrt(btex label etex, main.nw);
endfig;
\end{mplibcode}
\end{document}
\framebox
关键点是借助boxes
MetaPost 包将源框和目标框(我选择用 来排版)插入到更大的框中。
一旦完成,就可以很容易地访问这个框的左上角:它很简单main.nw
,main
是我给它的名字,nw
意思是“西北”。
我已将 MetaPost 编码插入到 LuaLaTeX 程序中,因为这是将 MetaPost 包含到 LaTeX 文档中最直接的方法。
对于那些不想使用 LuaLaTeX 的人,这里有一个使用该gmp
包的更通用的版本。(但你必须激活shell-escape
发行版的功能才能排版。)
\documentclass[border=2mm]{standalone}
\usepackage[latex, shellescape, everymp={input boxes}]{gmp}
\begin{document}
\begin{mpost*}
boxit.main(image(
label(btex \framebox[2.5cm]{Source} etex, origin);
label(btex \framebox[2.5cm]{Destination} etex, (0, -cm))));
main.dx = main.dy = 12pt;
drawunboxed(main); draw bpath(main) dashed evenly;
label.lrt(btex label etex, main.nw);
\end{mpost*}
\end{document}