我正在尝试使用 Tikz 库创建 LaTeX 文档,更具体地说是 E/R 图。我已经下载了tikz-er2
附加库,但在属性显示方面遇到了问题。
在我的课堂上,我们一直使用不同的符号,将属性名称放在点的右边,并将实体链接到这个点。
我如何使用 tikz 样式来实现这一点?
编辑:这是我的代码的一个(非常)简化版本,可以很好地编译:
\documentclass[a4paper,12pt,landscape]{article}
\usepackage[landscape]{geometry}
\usepackage{graphicx}
\usepackage{tikz-er2}
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}
\begin{document}
\thispagestyle{empty}
\usetikzlibrary{positioning}
\usetikzlibrary{shadows}
\tikzstyle{every entity} = [top color=white, bottom color=blue!40,
draw=blue!20!black!70, drop shadow, thin, rounded corners=2pt]
\tikzstyle{every attribute} = [shading=radial, inner color=white, outer color=yellow!50!gray!20!white,
draw=yellow, node distance=1cm, drop shadow, thin,align=center]
\centering
\begin{tikzpicture}[node distance=1.5cm]
\node[entity] (ent1) {Entity1};
\node[attribute] (attr1) [right=of ent1] {\key{Attr1}} edge (ent1);
\end{tikzpicture}
\end{document}
上面的代码产生了这个图表:
但我正在尝试完成这样的事情:
答案1
最简单的方法是从属性节点中删除所有绘制样式,而对从属性到实体的边使用一种新样式,即在开头绘制一个小圆圈。一种方法是简单地使用“带圆圈的箭头” edge[O-]
。另一种更可定制的方法如下。
我定义了一个名为的装饰draw circle
,它在线的开头绘制一个圆圈。您可以根据需要设置圆圈的样式,也可以选择其大小:
\tikzset{
draw circle/.style = {
decoration = {show path construction,
lineto code = {
\filldraw[black,fill=white] (\tikzinputsegmentfirst) circle(4pt);
}
}, decorate,
}
}
然后,您可以使用上述样式作为postaction
边的样式。为了简化语法,我定义了一种新样式来执行此操作:
\tikzset{
attr/.style = { postaction = {draw circle} }
}
您还需要删除属性节点的所有绘图样式:
\tikzset{
every attribute/.style = {draw=none,node distance=1cm }
}
然后,在图表中简单使用:
\node[attribute] (attr1) [right=of ent1] {\key{Attr1}} edge[attr] (ent1);
要得到:
综合起来:
\documentclass[a4paper,12pt,landscape]{article}
\usepackage[landscape]{geometry}
\usepackage{graphicx}
\usepackage{tikz-er2}
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}
\usetikzlibrary{positioning}
\usetikzlibrary{shadows,decorations.pathreplacing}
\begin{document}
\tikzset{
draw circle/.style = {
decoration = {show path construction,
lineto code = {
\filldraw[black,fill=white] (\tikzinputsegmentfirst) circle(4pt);
}
}, decorate,
},
attr/.style = { postaction = {draw circle} },
every entity/.style = { top color=white, bottom color=blue!40,
draw=blue!20!black!70, drop shadow, thin, rounded corners=2pt },
every attribute/.style = { draw=none,node distance=1cm }
}
\begin{tikzpicture}
\node[entity] (ent1) {Entity1};
\node[attribute] (attr1) [right=of ent1] {\key{Attr1}} edge[attr] (ent1);
\end{tikzpicture}
\end{document}