在多部分 TikZ 形状周围绘制细线

在多部分 TikZ 形状周围绘制细线

我正在寻找一种方法来在多部分形状周围绘制一条细线。对于普通形状,一种简单的方法是使用在preaction现有形状周围绘制一条更粗的线。不幸的是,不知何故,预处理似乎发生在多部分形状中绘制节点部分之后,从而产生了一条不必要的内线。

下面是一个最小的工作示例。您可以看到,右侧的常规框外面只有一条细细的橙色线。但是,左侧的多部分“内容框”有第二个内部橙色框。我的问题是如何摆脱这个内部框。如果有更好的方法来绘制这些框,我不一定非要使用多部分节点,但我希望它们是一个节点,这样我就可以向它们绘制箭头。(顺便说一句,我知道对于常规框,我可以在没有预先操作的情况下做到这一点,我只是用了一个来说明我试图对多部分节点做什么。)

在此处输入图片描述

\documentclass[convert]{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\begin{document}

\begin{tikzpicture}[
    contents box/.style={
      rounded corners,
      rectangle split, rectangle split parts=2,
      rectangle split draw splits=false,
      rectangle split part fill={orange!50, white},
      every one node part/.style={
        font=\sffamily\bfseries\small,
      },
      draw=orange!50, very thick,
      preaction={draw=orange, ultra thick},
    },
    regular box/.style={
      font=\sffamily\bfseries\small,
      rounded corners,
      fill=orange!50,
      very thick, draw=orange!50,
      preaction={draw=orange, ultra thick},
    }
  ]
  \node[contents box] {
    \nodepart{one} box
    \nodepart{two} contents
  };
  \node[regular box] at (2,0) { box };
\end{tikzpicture}

\end{document}

答案1

如果所有多部分框都像示例中的那样,那么也可以使用来tcolorbox绘制它们。

可以将它们用作node contentstikzpicture但也可以将它们包含到任何文本中,并使用remember或 的remember as帮助绘制指向它们的箭头(请参阅如何在颜色框之间画箭头)。

\documentclass[tikz,border=2mm]{standalone}
\usepackage[most]{tcolorbox}
\newtcbox{\mybox}[1]{
    colbacktitle=orange!50,
    colback=white,
    colframe=orange!50,
    halign title=center, 
    fonttitle=\bfseries\sffamily\small, 
    fontupper=\small,
    coltitle=black,
    title=#1,
    boxrule=1.6pt, 
    enhanced,borderline={1.2pt}{-1.2pt}{orange},
    enlarge bottom by=1.2pt,
    enlarge top by=1.2pt,
    enlarge right by=1.2pt,
    enlarge left by=1.2pt,}
\begin{document}
\begin{tikzpicture}
\node[inner sep=0pt] (A) at (0,0)  {\mybox{box}{contents}};
\node[inner sep=0pt] (B) at (3,1) {\mybox{box}{contents}};

\draw[orange,ultra thick] (A.north) to[out=85,in=180](B.west);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这是一个基于@Alenanno 使用\tikzlastnodeinside的关键思想的解决方案append after command。剩下的棘手部分是,您必须设置多部分节点的外部 sep,并且知道稍后它将被一条超粗线跟踪,然后还要补偿该外部 sep 值。超粗线为 1.6pt,因此一半(适当的外部 sep)为 0.8pt。

\documentclass[convert]{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\begin{document}

\begin{tikzpicture}[
    contents box/.style={
      rounded corners,
      rectangle split, rectangle split parts=2,
      rectangle split draw splits=true,
      rectangle split part fill={orange!50, white},
      every one node part/.style={ font=\sffamily\bfseries\small },
      draw=orange!50, very thick,
      outer sep=0.8pt, % 1/2 ultra-thick line width
      append after command={
        \pgfextra{
          \draw[orange, ultra thick, rounded corners] 
          ([shift={(0.8pt,0.8pt)}] \tikzlastnode.south west)
          rectangle
          ([shift={(-0.8pt,-0.8pt)}] \tikzlastnode.north east)
          ;}
    }},
    regular box/.style={
      font=\sffamily\bfseries\small,
      rounded corners,
      fill=orange!50,
      very thick, draw=orange!50,
      preaction={draw=orange, ultra thick},
    }
  ]
  \node[contents box] {
    \nodepart{one} box
    \nodepart{two} contents
  };
  \node[regular box] at (2,0) { box };
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案3

您也可以事后再绘制它。例如,如果节点名为b,则:

  \path [draw=orange, thin, rounded corners] (b.south west) rectangle (b.north east);

将绘制一条适当的路径:

绘制的盒子

没有任何明显的方法可以将其作为节点本身规范的一部分来实现。

但是,您可以通过定义pic一个来一步完成所有操作,使事情变得更方便:

    contents pic/.pic={
      \node (a) [contents box] {#1};
      \path [draw=orange, thin, rounded corners] (a.south west) rectangle (a.north east);
    },

然后你可以写,例如:

  \pic at (1.75,0) { contents pic={
    \nodepart{one} box
    \nodepart{two} contents
    }
  };

绘制先前节点 + 路径的克隆。为了进行比较:

比较

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{shapes.multipart}
\begin{document}
\begin{tikzpicture}[
    contents box/.style={
      rounded corners,
      rectangle split,
      rectangle split parts=2,
      rectangle split draw splits=false,
      rectangle split part fill={orange!50, white},
      every one node part/.style={
        font=\sffamily\bfseries\small,
      },
      draw=orange!50,
      very thick,
    },
    regular box/.style={
      font=\sffamily\bfseries\small,
      rounded corners,
      fill=orange!50,
      very thick,
      draw=orange!50,
      preaction={draw=orange, ultra thick},
    },
    contents pic/.pic={
      \node (a) [contents box] {#1};
      \path [draw=orange, thin, rounded corners] (a.south west) rectangle (a.north east);
    },
  ]
  \node (b) [contents box] {
    \nodepart{one} box
    \nodepart{two} contents
  };
  \path [draw=orange, thin, rounded corners] (b.south west) rectangle (b.north east);
  \pic at (1.75,0) { contents pic={
    \nodepart{one} box
    \nodepart{two} contents
    }
  };
  \node[regular box] at (3.25,0) { box };
\end{tikzpicture}
\end{document}

相关内容