如何在 LaTeX 中创建将外键连接到相应主键的箭头?
我想要实现的最终结果是:
在 LaTeX 中执行此操作的最佳方法是什么(我对这个主题还不熟悉。是否有一些实用的方法,或者最好在另一个程序中创建它并将其导入为图像(或 PDF?)
答案1
TikZ
不幸的是,没有自动路由功能……因此,如果您希望这些箭头在文本周围移动,则必须手动执行。幸运的是,这并不难。我能想到的最简单的方法是将要链接的单词更改为TikZ
节点,然后绘制连接它们的弧。您可以按照以下方式为您的示例执行此操作:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\noindent
relation1(\tikz[remember picture]\node[inner sep=0pt] (1id) {\textbf{id}};, \tikz[remember picture]\node[inner sep=0pt] (1r2) {relation2\_id};, \tikz[remember picture]\node[inner sep=0pt] (1r3) {relation3\_id};, attribute1)\\[.5cm]
relation2(\tikz[remember picture]\node[inner sep=0pt] (2id) {\textbf{id}};, \tikz[remember picture]\node[inner sep=0pt] (2r3) {relation3\_id};, attribute2)\\[.5cm]
relation3(\tikz[remember picture]\node[inner sep=0pt] (3id) {\textbf{id}};, attribute3)
\begin{tikzpicture}[overlay, remember picture]
\path[draw,->] (1r2.south) ++(0,-.1) -- ++(0,-.2) -| ($(2id.north) + (0,.1)$);
\path[draw,->] (1r3.south) ++(0,-.1) -- ++(0,-.2) -- ++(1,0) -- ++(0,-1) -| ($(3id.60) + (0,.1)$);
\path[draw,->] (2r3.south) ++(0,-.1) -- ++(0,-.2) -| ($(3id.120) + (0,.1)$);
\end{tikzpicture}
\end{document}
结果如下:
更新:为了完整性,我做了一个小补充。您可以通过将路径选项更改为 来接近图片中的样式(线条/箭头方向)[draw, thick, -latex]
。再加上稍微修改线条位置,就会得到以下结果:
更新 2:回应您的评论,下划线和 等字母j
使文本周围的框变大。为了解决这个问题,我们可以使用text height
和的组合text depth
。代码如下所示:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\noindent
\tikzset{
text depth=0ex,
text height=1ex,
inner sep=0pt,
}%
relation1(\tikz[remember picture]\node (1id) {\underline{id}};, \tikz[remember picture]\node (1r2) {relatjon2\_id};, \tikz[remember picture]\node (1r3) {relation3\_id};, attribute1)\\[.5cm]
relation2(\tikz[remember picture]\node (2id) {\textbf{id}};, \tikz[remember picture]\node (2r3) {relation3\_id};, attribute2)\\[.5cm]
relation3(\tikz[remember picture]\node (3id) {\textbf{id}};, attribute3)
\begin{tikzpicture}[overlay, remember picture]
\path[draw,thick,-latex] (1r2.south) ++(0,-.1) -- ++(0,-.2) -| ($(2id.north) + (0,.1)$);
\path[draw,thick,-latex] (1r3.south) ++(0,-.1) -- ++(0,-.2) -- ++(1,0) -- ++(0,-.97) -| ($(3id.60) + (0,.1)$);
\path[draw,thick,-latex] (2r3.south) ++(0,-.1) -- ++(0,-.2) -| ($(3id.120) + (0,.1)$);
\end{tikzpicture}
\end{document}
还请注意此处的使用tikzset
,可一次性设置所有节点的节点属性。生成的图像带有下划线id
和relatjon
:
答案2
无需知道任何坐标。使用以下命令运行xelatex
\documentclass{article}
\usepackage{pst-node}
\parindent=0pt
\begin{document}
relation1(\textbf{id}, \rnode{t2}{relation2\_id}, \rnode{t3}{relation3\_id}, attribute1)\\[.7cm]
relation2(\rnode{mid}{\textbf{id}}, \rnode{mr3}{relation3\_id}, \rnode[r]{ma2}{attribute2) }\\[.7cm]
relation3(\rnode{bid}{\textbf{id}}, attribute3)
\psset{linecolor=red,linewidth=1.5pt,arrowscale=1.5,angleA=-90,angleB=90}
\ncangle{->}{t2}{mid}
\ncangle[nodesepB=0]{t3}{ma2}
\ncangle[angleA=90,angleB=90,nodesepA=0,armB=4mm,offsetB=1mm]{->}{ma2}{bid}
\ncangles[armA=3mm,offsetB=-1mm]{->}{mr3}{bid}
\end{document}