在 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
问题
这里有两个问题:
由于
double
默认的外部分隔符无法正确地将形状的边框放在双线的外面。这些
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 -- b
和c -- 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
,但最直接的通用解决方案是
- 所有节点都填充白色:
fill = white
, - 把所有边缘放在背景上,
- 使用矩形线帽:
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}