我正在使用 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}