TikZ ER 图双边看起来很丑

TikZ ER 图双边看起来很丑

在 TikZ 中绘制 ER 图并使用双边会导致这些边与节点的连接不美观。如何才能将这些边与其他节点很好地连接起来?

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{positioning, er}

\begin{document}
\begin{tikzpicture}[font=\footnotesize]
\node [entity, double distance=1.5pt] (test) {Test};
\node [attribute, right=of test] {TestID} edge (test);
\node [attribute, double distance=1.5pt, left=of test] {Attribute} edge[double distance=1.5pt] (test);
\node [relationship, below=of test] (test2) {Test} edge[double distance = 1.5pt] (test);
\node [relationship, double distance=1.5pt, below left=of test] (test3) {Test} edge[double distance = 1.5pt] (test);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

问题

这里有两个问题:

  1. 由于double默认的外部分隔符无法正确地将形状的边框放在双线的外面。

  2. 这些double线实际上就是:一条画了两次的线,一条是非常粗(<double distance> + 2 \pgflinewidth)的黑线,然后<double distance>在它上面有一条较细(仅)的白线。

    它们与所有不与边界正交的节点连接的粗线有同样的问题。

    图片

    \tikz\graph[nodes={line width=5pt, draw}, edges={red, line width=5pt}]{
      a -- b[xshift=5mm];
      c -- d -- {a, b};
    };
    

    将导致
    在此处输入图片描述

    连接a -- bc -- d外观都不错,a -- d我们可以接受,但b -- d就是不好。

解决方案

第 1 点可以轻松解决:将外部 seps 设置为.5*<double distance> + \pgflinewidth

对于第 2 点,我建议将边缘放在节点后面并使用矩形线帽:

\tikz[graphs/edges={red, line width=5pt}]
  \graph[nodes={line width=5pt, draw}]{
     a -- b[xshift=5mm];
     c -- d
   } [behind path] graph[use existing nodes, edges={line cap=rect}]{
     d -- {a, b}
   };

在此处输入图片描述

仅当边的线宽不大于节点的线宽时,此方法才会有效: 在此处输入图片描述

事实上,未加倍的节点也会发生同样的事情:
在此处输入图片描述

虽然在这种特定情况下,我们可以不使用矩形线帽,而是缩短边缘sqrt(2)*<double distance+2\pgflinewidth,但最直接的通用解决方案是

  1. 所有节点都填充白色:fill = white
  2. 把所有边缘放在背景上,
  3. 使用矩形线帽:line cap=rect

这对于

  • 将节点放置在白色背景上,
  • 直线。

对于曲线,可能需要使用负缩短量(参见第3张图)。

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning, er, graphs}
\tikzset{
  edges/.style={every edge/.append style={#1}},
  Double/.style={double distance={#1}, outer sep=.5*(#1)+\pgflinewidth},
  Double/.default=1.5pt}
\begin{document}
\tikz[font=\footnotesize, dbl/.style=Double]
  \node [entity,       dbl]              (test) {Test}
   node [attribute,              right=of test] {TestID}    edge (test)
   [edges=Double]
   node [attribute,    dbl,       left=of test] {Attribute} edge (test)
   node [relationship,           below=of test] {Test}      edge (test)
   node [relationship, dbl, below left=of test] {Test}      edge (test);

\tikz[font=\footnotesize, dbl/.style=Double, nodes={fill=white}]
  \node [entity,       dbl]                     (test)  {Test}
   node [attribute,              right=of test] (id)    {TestID} edge (test)
   node [attribute,    dbl,       left=of test] (attr)  {Attribute}
   node [relationship,           below=of test] (test2) {Test}
   node [relationship, dbl, below left=of test] (test3) {Test}
   [behind path]
   graph[use existing nodes, edges={line cap=rect}]{
     test --[Double] {attr, test2, test3}
   };
\tikz[font=\footnotesize, dbl/.style=Double, nodes={fill=white}]
  \node [entity,       dbl]                     (test)  {Test}
   node [attribute,              right=of test] (id)    {TestID} edge (test)
   node [attribute,    dbl,       left=of test] (attr)  {Attribute}
   node [relationship,           below=of test] (test2) {Test}
   node [relationship, dbl, below left=of test] (test3) {Test}
   [behind path]
   graph[use existing nodes, edges={line cap=rect}]{
     test --[bend left, Double, shorten <=-1.5pt] {attr, test2, test3}
   };
\end{document}

输出(第二张图)

在此处输入图片描述

相关内容