操作系统: Windows 11
发行版: TeX Live 2025
使用 Tabularray 绘制 uml 类图,我想出了两种方案
将表格放在 node 节点里面, 使用 tikz 绘制直线
\documentclass[tikz,border=10pt]{standalone}
\usepackage{tabularray}
\UseTblrLibrary{tikz}
\usetikzlibrary{patterns,positioning}
\begin{document}
\begin{tikzpicture}[every node/.style = {inner sep=0pt}]
\node (Circular)
{
\begin{tblr}{colspec={l},rowspec={cll}, row{1}={font=\bfseries},vlines,hlines}
Circular \\
bottom: Circle \\
setBottom (Circle): void \\
\end{tblr}
};
\node (Circle) [right=1cm of Circular]%
{
\begin{tblr}{colspec={l},rowspec={cll},row{1}={font=\bfseries},vlines,hlines}
Circle \\
radius: double \\
getArea(): double \\
\end{tblr}
};
\draw[->,red,thick] (Circular.east)--(Circle.west);
\end{tikzpicture}
\end{document}
使用 tabularray 的实验性库 tikz, 将两个类图放在同一张表格里,使用单元格节点控制直线的位置(这个方案目前看来最简单, 但由于拓展性不强放弃了(如果需要调整多个绘图代码,则需要反复调整表格的布局))
\documentclass[border=10pt]{standalone}
\usepackage{tabularray}
\UseTblrLibrary{tikz}
\usetikzlibrary{patterns,positioning}
\begin{document}
\begin{tblrtikzabove}
\draw[thick,red,->] (1-1.mid east)--(1-3.mid west);
\end{tblrtikzabove}
\begin{tblr}{colspec={lQ[2cm]l},rowspec={cll}, row{1}={font=\bfseries},vlines,hlines={1,3}{solid}}
Circular & & Circle \\
bottom: Circle & & radius: double \\
setBottom (Circle): void & & getArea(): double \\
\end{tblr}
\end{document}
问题:
在第一个方案中如何控制相对坐标绘制的直线:
\draw[->,red,thick] (Circular.east)--(Circle.west);(使用 shift 选项无效!!)
感谢 Explorer 老师,接骨木剑老师,hob 老师在 QQ 群的关注。Explorer 老师最终给出了如下解决方案
使用 tikz 库 calc 控制位置
\def\pos{0.75}
\coordinate(start) at ($(Circular.south east)!\pos!(Circular.north east)$);
\coordinate(end) at ($(Circle.south west)!\pos!(Circle.north west)$);
\draw[black,red,thick] (start) -- (end);完整代码如下:
\documentclass[border=10pt,tikz]{standalone}
\usepackage{tabularray}
\usetikzlibrary{patterns,positioning,calc}
\begin{document}
\begin{tikzpicture}[every node/.style = {inner sep=0pt}, line cap=round]
\node (Circular)
{
\begin{tblr}{
colspec={l}, rowspec={c||l},
row{1}={font=\bfseries},
vlines,hlines
}
Circular \\
bottom: Circle \\
setBottom (Circle): void \\
\end{tblr}
};
\node (Circle) [right=1cm of Circular]
{
\begin{tblr}{
colspec={l}, rowspec={c||l},
row{1}={font=\bfseries},
vlines,hlines
}
Circle \\
radius: double \\
getArea(): double \\
radius: double \\
getArea(): double \\
\end{tblr}
};
\def\pos{0.75}
\coordinate(start) at ($(Circular.south east)!\pos!(Circular.north east)$);
\coordinate(end) at ($(Circle.south west)!\pos!(Circle.north west)$);
\draw[black,red,thick] (start) -- (end);
\end{tikzpicture}
\end{document}效果如下

关于第二个方案的一个类似的例子(参考 pgf-umlcd 宏包;这也是为什么不使用第二种方案的原因)

Explorer 老师还提到 “这里三个tblr的排布需要tikz环境,我感觉tabularray的tikz功能更多是处理「一个tblr内部的连接需求」”