在适合块的左上角添加标签

在适合块的左上角添加标签

我希望移动适合块左上角的标签,但现在它似乎位于中心。

\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不包含任何文本的选项的节点,为其命名,然后使用普通节点在所需位置添加文本。或者,考虑使用 labelpin选项。

我认为另一个节点是最干净的方式:

\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关键点是借助boxesMetaPost 包将源框和目标框(我选择用 来排版)插入到更大的框中。

一旦完成,就可以很容易地访问这个框的左上角:它很简单main.nwmain是我给它的名字,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}

相关内容