在 TikZ 中拟合不规则节点周围的形状

在 TikZ 中拟合不规则节点周围的形状

我有以下哈斯图

哈斯图

使用以下代码:

\documentclass[a4paper, 12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{fit}    

\begin{document}

    \begin{figure}[h]
    \centering
    \begin{tikzpicture}
      \node (abc) at (0,4) {$\{a,b,c\}$};
      \node (ab) at (-2,2) {$\{a,b\}$};
      \node (ac) at (0,2) {$\{a,c\}$};
      \node (bc) at (2,2) {$\{b,c\}$};
      \node (a) at (-2,0) {$\{a\}$};
      \node (b) at (0,0) {$\{b\}$};
      \node (c) at (2,0) {$\{c\}$};
      \node (empty) at (0,-2) {$\{\}$};
      \draw (abc) -- (ab) -- (a) -- (empty) -- (c) -- (bc) -- (abc) -- (ac) -- (a)
      (ac) -- (c)
      (b) -- (empty);
      \draw[preaction={draw=white, -,line width=6pt}] (ab) -- (b) -- (bc);
    \end{tikzpicture}
    \label{fig:hasse}
\end{figure}

\end{document}

我试图在一些节点周围画一个框,像这样:

\documentclass[a4paper, 12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{fit}    

\begin{document}

    \begin{figure}[h]
    \centering
    \begin{tikzpicture}
      \node (abc) at (0,4) {$\{a,b,c\}$};
      \node (ab) at (-2,2) {$\{a,b\}$};
      \node (ac) at (0,2) {$\{a,c\}$};
      \node (bc) at (2,2) {$\{b,c\}$};
      \node (a) at (-2,0) {$\{a\}$};
      \node (b) at (0,0) {$\{b\}$};
      \node (c) at (2,0) {$\{c\}$};
      \node (empty) at (0,-2) {$\{\}$};
      \draw (abc) -- (ab) -- (a) -- (empty) -- (c) -- (bc) -- (abc) -- (ac) -- (a)
      (ac) -- (c)
      (b) -- (empty);
      \draw[preaction={draw=white, -,line width=6pt}] (ab) -- (b) -- (bc);
    \node[draw,dotted,fit=(ab) (a) (b)] {};
    \end{tikzpicture}
    \label{fig:hasse}
\end{figure}

\end{document}

(毫不奇怪)最终看起来像这样:

哈斯图 2

我想要的(理想情况下)是制作一些圆角三角形,覆盖节点 (ab)、(a) 和 (b),使得 (ac) 保持未覆盖状态。我对 tikz 还很陌生(尽管我经常使用 tikz-cd),所以我不确定哪个库会有所帮助,而不会使代码过于复杂(我读过的几个答案如果没有解释,我将无法适应我的目的)。

任何帮助都值得感激,谢谢!

答案1

您也可以使用 来完成此操作tikz-cd

execute at end picture={...}可以添加绘制后需要执行的任何 TikZ 命令tikzcd

这个crossing over想法来自塞巴斯蒂亚诺已删除的答案。

如果你不想命名,matrix你可以使用 \tikzcdmatrixname直接使用(见marmot 的这个回答, 例如)。

要为整个tikzcd文档设置一些选项,您可以使用\tikzcdset{...},请参阅第 2 节控制图表的外观包装文档

矩阵语法类似于任何其他 LaTeX 表:&分隔单元格和\\分隔行。

该命令\ar是的缩写。\arrow其选项u、、和分别表示上、下、左、右(箭头方向)。 dlr

该选项execute at end picture={...}允许您添加一些在绘制图表后执行的 TikZ 命令。

mymatr-n-m是矩阵的行n和列元素。mmymatr

\coordinate (comodo) at (mymatr-2-1.north west |- mymatr-3-1.south west);创建comodo坐标 x = 的点mymatr-2-1.north west,坐标 y = 的点mymatr-3-1.south west

\draw (A) -- (B);从 A 到 B 画一条线。

dashed并且rounded corners是具有明显含义的选项。

yshift=...垂直、水平移动坐标xshift=...

cycle最后告诉我们路径必须从这里到达起点。

\documentclass[a4paper,12pt]{article}
\usepackage{tikz-cd}
\tikzcdset{
    every arrow/.append style={dash},
    every diagram/.style={
        row sep=50pt,
        column sep=30pt
        }, 
    }

\begin{document}
\begin{tikzcd}[
    every matrix/.style={name=mymatr},
    execute at end picture={
        \coordinate (comodo) at (mymatr-2-1.north west |- mymatr-3-1.south west); 
        \draw[dashed, rounded corners] ([yshift=3pt]mymatr-2-1.north west) --  ([yshift=-3pt]comodo) -- ([yshift=-3pt, xshift=2pt]mymatr-3-2.south east) -- ([yshift=4pt, xshift=2pt]mymatr-3-2.north east) -- ([yshift=3pt]mymatr-2-1.north east) -- cycle;
        }
    ]
 & \{a,b,c\} \ar[ld] \ar[d] \ar[rd]\\
\{a,b\} \ar[d] & \{a,c\} \ar[ld] \ar[rd] & \{b,c\} \ar[d, crossing over] \ar[ld, crossing over] \\
\{a\} \ar[rd] & \{b\} \ar[lu, crossing over] \ar[d, crossing over] & \{c\} \ar[ld] \\
 & \{\}  
\end{tikzcd}
\end{document}

在此处输入图片描述

答案2

为了更加灵活,您可以手动绘制所需节点周围的路径:

\documentclass[a4paper, 12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{fit}    

\begin{document}

    \begin{figure}[h]
    \centering
    \begin{tikzpicture}
      \node (abc) at (0,4) {$\{a,b,c\}$};
      \node (ab) at (-2,2) {$\{a,b\}$};
      \node (ac) at (0,2) {$\{a,c\}$};
      \node (bc) at (2,2) {$\{b,c\}$};
      \node (a) at (-2,0) {$\{a\}$};
      \node (b) at (0,0) {$\{b\}$};
      \node (c) at (2,0) {$\{c\}$};
      \node (empty) at (0,-2) {$\{\}$};
      \draw (abc) -- (ab) -- (a) -- (empty) -- (c) -- (bc) -- (abc) -- (ac) -- (a)
      (ac) -- (c)
      (b) -- (empty);
      \draw[preaction={draw=white, -,line width=6pt}] (ab) -- (b) -- (bc);
\draw[dotted,rounded corners=20pt] ([yshift=0.9cm]ab.north west) -- ([xshift=-0.15cm,yshift=-0.1cm]a.south west) -- ([xshift=0.7cm,yshift=-0.1cm]b.south east) -- cycle;
    \end{tikzpicture}
    \label{fig:hasse}
\end{figure}

\end{document}

在此处输入图片描述

相关内容