如何在 TikZ 中绘制类似 ER 图的专业化(在直线中间绘制方向敏感的形状)?

如何在 TikZ 中绘制类似 ER 图的专业化(在直线中间绘制方向敏感的形状)?

我正在使用 tikz-er2.sty 包,并根据我的目的对其进行扩展以绘制 ER 图。此包中缺少一个概念,即专业化。我正在寻找的专业化符号的示例如下这里。基本上,它是连接两个实体(或专业化圆)的直线中间的一个子集符号。

我考虑过如何实现这一点,但还没有想出一个优雅的解决方案。当然,为了正确地定位符号,需要考虑从一个实体到另一个实体的线的方向。一个主要的想法是将符号预定义为宏中的节点,或者只使用普通的 $\bigcup$ 符号,然后以正确的旋转将其绘制在中间:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{positioning, arrows}

% Some definitions taken from tikz-er2.sty
\tikzstyle{every entity} = []
\tikzstyle{every link} = []

\tikzstyle{link} = [>=triangle 60, draw, thick, every link]
\tikzstyle{entity} = [rectangle, draw, black, very thick,
minimum width=6em, minimum height=3em,
every entity]

\begin{document}
    \begin{tikzpicture}[node distance=.5cm, every edge/.style={link}]
        % This works easily
        \node[entity] (left) {Left};
        \node[entity, right=3cm of left] (right) {Right};

        \draw[link] (left) -- node[pos=.5] (mid) {} (right);
        \node[rotate=-90, xscale=1.2] (U) at (mid) {$\bigcup$};

        \begin{scope}[yshift=-3cm]
            % This is more difficult... how to find roation automatically?
            \node[entity] (topleft) {Top Left};
            \node[entity, below right=3cm and 2cm of topleft] (bottomright) {Bottom Right};

            \draw[link] (topleft) -- node[pos=.5] (mid) {} (bottomright);
            \node[rotate=-135, xscale=1.2] (U) at (mid) {$\bigcup$};
        \end{scope}
    \end{tikzpicture}
\end{document}

关于这个 MWE,我不喜欢的地方有三点:

  • 我发现符号太小,调整其大小也会影响线条粗细(线条粗细应该与链接保持一致)。也许可以通过定义一个独立宏来绘制自定义符号并旋转整个路径来纠正这个问题。
  • 您必须使用多个绘制语句,这些语句最多只能包装成一个宏。也许 TikZ 也有将所有这些包装成一个样式的功能?
  • 主要问题:对于非平凡的实体定位,你必须手动找到正确的旋转

您是否知道如何自动实现我想要的效果,例如 TikZ 为我计算旋转度?

答案1

这是使用库的完整解决方案decorations。请注意,您提到的包似乎很旧,因为arrows库和现在分别被库和宏\tikzstyle取代。arrows.meta\tikzset

该解决方案\bigcup用作为标记样式的自定义路径替换符号,该样式附加到现有link样式。

由于标记是相对于当前路径方向绘制的,因此所有这些都避免了使用旋转节点的问题。

第二个链接用不同的线宽绘制,以显示这也会改变符号线宽,但不改变其大小。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning, arrows, decorations.markings}

% Some definitions taken from tikz-er2.sty
\tikzstyle{every entity} = []
\tikzstyle{every link} = []
\tikzstyle{link} = [>=triangle 60, draw, thick, every link]
\tikzstyle{entity} = [rectangle, draw, black, very thick,
minimum width=6em, minimum height=3em,
every entity]

\tikzset{link/.append style={
    postaction={decorate},
    decoration={
        markings,
        mark= at position 0.5 with {
            \draw (0.5em,1ex) -- (-0.5em,1ex) to[bend right=90] (-0.5em,-1ex) -- (0.5em,-1ex);
        }
    }
}
}

\begin{document}
\begin{tikzpicture}[node distance=.5cm, every edge/.style={link}]
    % This works easily
    \node[entity] (left) {Left};
    \node[entity, right=3cm of left] (right) {Right};
    \draw[link] (left) -- (right);
    \begin{scope}[yshift=-3cm]
        \node[entity] (topleft) {Top Left};
        \node[entity, below right=3cm and 2cm of topleft] (bottomright) {Bottom Right};
        \draw[link,line width=2pt] (topleft) -- (bottomright);
    \end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容