使用 `tabularray` 绘制 `uml` 类图,如何控制`相对坐标`绘制直线的位置?

发布于 2025-11-16 08:18:15

操作系统: 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}

    image.png

  • 使用 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}

    image.png

问题:

在第一个方案中如何控制相对坐标绘制的直线:

\draw[->,red,thick] (Circular.east)--(Circle.west);

(使用 shift 选项无效!!)

查看更多

关注者
0
被浏览
56
1 个回答
Absinthe
Absinthe 3小时前
这家伙很懒,什么也没写!

感谢 Explorer 老师,接骨木剑老师,hob 老师在 QQ 群的关注。Explorer 老师最终给出了如下解决方案

使用 tikzcalc 控制位置

\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}

效果如下

image.png

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

image.png

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

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览