如何绘制一个表格,其中箭头从一行指向另一行?

如何绘制一个表格,其中箭头从一行指向另一行?

我正在开发一个文档工具,用于记录一系列序列。

我目前使用 \ncbar 和 pstricks 来生成以下输出:

在此处输入图片描述

\documentclass{article}
%\usepackage[a1paper, margin=1in]{geometry}
\usepackage[paperwidth=26in,paperheight=33in, margin=1in]{geometry}
\usepackage{lscape}
\usepackage{array} 
\usepackage{longtable} 
\usepackage[pdf]{pstricks}
\usepackage[off]{auto-pst-pdf}
\usepackage{pst-all}
\usepackage{pstricks-add}
\usepackage{pst-node}

\begin{document}

\setlength{\arrayrulewidth}{0.1mm}
\setlength{\tabcolsep}{14pt}
\renewcommand{\arraystretch}{1.3}


\psset{arrows=->, arrowinset=0.12, linearc=0.05}
\newcommand{\mynode}[1]{\pnode[0pt,0.5ex]{#1}}

\newcolumntype{Y}{>{\raggedright\arraybackslash}m{10cm}}

% | index | tag | opcode description | branch_target | branch_target index | comment |
\begin{longtable}{|c p{0.8em}|l|l|l|@{\qquad}p{0.4em}@{\qquad}c|}
    \hline
    & \textbf{} & \textbf{$Section Tag$} & \textbf{$Opcode$} & \textbf{$Branch$} & \textbf{} & \qquad\\
    \hline
    \hline
    \endfirsthead
    \endhead
    \hline
    \endlastfoot
    
    \mynode{a0} &0 &\verb++ &\verb+people search+ &\verb+people finder+ &\verb+2+ &\mynode{a0a} \\ 
    \hline 
    \mynode{a1} &1 &\verb++ &\verb+daily motion+ &\verb++ &\verb++ &\mynode{a1a} \\ 
    \hline 
    \mynode{a2} &2 &\verb+monila+ &\verb+faradays low+ &\verb++ &\verb++ &\mynode{a2a} \\ 
    \hline 
    \mynode{a3} &3 &\verb++ &\verb+ohms lawyer+ &\verb++ &\verb++ &\mynode{a3a} \\ 
    \hline 
    \mynode{a4} &4 &\verb+fafral+ &\verb+gpu work)+ &\verb++ &\verb++ &\mynode{a4a} \\ 
    \hline 
    \mynode{a5} &5 &\verb+find+ &\verb+internally fit+ &\verb++ &\verb++ &\mynode{a5a} \\ 
    \hline 
\end{longtable}

\ncbar[arm=2.5cm]{a0a}{a1a} 
\ncbar[arm=-3.1cm]{a4}{a3} 
\ncbar[arm=2.7cm]{a3a}{a5a} 
\ncbar[arm=-2.3cm]{a1}{a2} 
\ncbar[arm=1.9cm]{a2a}{a5a} 

\end{document}

我正在尝试开发的主要功能是绘制箭头。我们需要箭头来建立不同行之间的视觉关系。

计划是使用 python 以编程方式生成 latex 表,然后调用 pdflatex (linux) 将生成的 tex 文件转换为 pdf。使用 ncbar,我可以以编程方式为每行生成 2 个节点名称(一个在开头,另一个在结尾)。然后,python 程序遍历列表并找出哪些节点需要相互连接。

现在的问题是,我在具有旧版本 pdflatex 的旧版 Linux 服务器上运行该文档程序pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)

此 pdflatex 版本无法编译我的 latex 输出。我收到错误: ! LaTeX Error: File `auto-pst-pdf.sty' not found.

使用 xelatex 编译器选项,Latex 代码在 Overleaf 上完美编译。我能够使用较新版本的 pdflatex 在本机上对其进行编译,尽管表格行中存在一些错误。

行宽不均匀(在本地电脑上使用较新版本的 texlive 进行编译时)

我的理论是,此版本不支持 pstricks 和 postscript。

本论坛上之前的帖子建议使用 Xelatex 来编译 pstricks。但我没有权限在此服务器上安装任何应用程序。

我想尝试不使用 pstricks 和 postscript 来实现同样的功能。只需使用可轻松与 pdflatex 编译的基本 latex。

我怎样才能实现这个目标?

注意:我使用长表是因为该表可能跨越多页,并且我们希望有一个长连续表,这样我们就可以有箭头关系。

TLDR:用基本乳胶替换 \ncbar 和 pstricks 以实现相同的输出。

恕我直言,请在将问题标记为重复之前仔细阅读。我花了一天时间在这个论坛上寻找解决方案,花了大约一个小时构思这个问题,这不是一个重复的问题。它有比从单元格指向箭头更复杂的要求。

答案1

这是与此密切相关的问题的答案的扩展版本添加从一个表格单元格指向另一个表格单元格的箭头

就像在那个答案中一样,我们的想法是在表格单元格中定义 TikZ 节点,然后从一个节点到另一个节点绘制箭头。

与另一个问题的不同之处在于,这里的箭头有三个段,左下右或右下左分别代表第一列和最后一列。

要绘制这样的箭头,calc可以使用 tikzlibrary 来定义由节点加上或减去坐标组成的伪节点。在本例中,例如(node)+(2.5,0)距离节点右侧 2.5 处的点。calc 库中的完整语法是($(node)+(x,y)$)

如果单元格内容的长度可变,则可以将箭头绘制到.west节点的(左)侧,对于左对齐表格列中所有长度的内容,该箭头位于相同的位置。

在下面的 MWE 中,我手动写下了从 a0a 到 a1a 的箭头。这有很多语法,因此我还在表格的左侧和右侧添加了两个命令\tnbarleft和箭头,默认距离为 2.5。\tnbarright

此外,我还简化了表格和一些字体设置。

平均能量损失

\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{array} 
\usepackage{longtable}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand*{\tn}[2]{\tikz[baseline,remember picture]\node[inner sep=0pt,anchor=base] (#1) {#2};}
\newcommand*{\tnbarleft}[3][2.5]{\tikz[remember picture,overlay]\draw[->] ($(#2)-(1,0)$) -- ($(#2)-(#1,0)$) -- ($(#3)-(#1,0)$) -- ($(#3)-(1,0)$);}
\newcommand*{\tnbarright}[3][2.5]{\tikz[remember picture,overlay]\draw[->] ($(#2.west)+(1.0,0)$) -- ($(#2.west)+(#1,0)$) -- ($(#3.west)+(#1,0)$) -- ($(#3.west)+(1.0,0)$);}


\begin{document}

\setlength{\arrayrulewidth}{0.1mm}
\setlength{\tabcolsep}{14pt}
\renewcommand{\arraystretch}{1.3}

\begin{longtable}{|c p{0.8em}|l|l|l|@{\qquad}p{0.4em}@{\qquad}c|}
    \hline
    &  & \textit{Section Tag} & \textit{Opcode} & \textit{Branch} &  & \qquad\\
    \hline
    \hline
    \endfirsthead
    \endhead
    \hline
    \endlastfoot
    
     &0 & &\texttt{people search} &\texttt{people finder} &\tn{a0a}{\texttt{2}} & \\ 
    \hline 
     & \tn{a1}{1} & &\texttt{daily motion} & & \tn{a1a}{345} & \\ 
    \hline 
     & \tn{a2}{2} &\texttt{monila} &\texttt{faradays low} & & \tn{a2a}{1} & \\ 
    \hline 
     & \tn{a3}{3} & &\texttt{ohms lawyer} & & \tn{a3a}{22} & \\ 
    \hline 
     & \tn{a4}{4} &\texttt{fafral} &\texttt{gpu work)} & & \tn{a4a}{333} & \\ 
    \hline 
     &5 &\texttt{find} &\texttt{internally fit} & & \tn{a5a}{4444} & \\ 
    \hline 
\end{longtable}
\tikz[remember picture,overlay]
\draw[->] ($(a0a.west)+(1.0,0)$) -- ($(a0a.west)+(2.5,0)$) -- ($(a1a.west)+(2.5,0)$) -- ($(a1a.west)+(1.0,0)$);
\tnbarleft{a1}{a2}
\tnbarleft[3.5]{a4}{a3}
\tnbarright[2]{a2a}{a5a}
\tnbarright{a3a}{a5a}
\end{document}

结果:

在此处输入图片描述

答案2

如果您不需要跨多页的表格,我建议使用。的nicematrix环境类似于经典的(包的),但在单元格、行和列下创建 PGF/Tikz 节点。然后,您可以使用这些节点用 Tikz 绘制您想要的任何规则。{NiceTabular}nicematrix{tabular}array

\documentclass{article}
\usepackage{nicematrix,tikz}

\begin{document}

\NiceMatrixOptions{cell-space-limits=3pt}

\begin{NiceTabular}[hvlines]{*{4}{wc{2cm}}}
one & two & three & four \\
one & two & three & four \\
one & $\frac{\frac{1}{1+a}}{\frac{2}{1+b}}$ & three & four \\
one & two & three & four \\
\CodeAfter
  \tikz \draw [->] ([xshift=-2mm]1.5-|last) -- ++(5mm,0) |- ([xshift=-2mm]3.5-|last) ; 
\end{NiceTabular}

\end{document}

您需要多次编译(因为 PGF/Tikz 节点)。

上述代码的输出

答案3

%\RequirePackage{pdfmanagement-testphase}
%\DeclareDocumentMetadata{}
\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{array} 
\usepackage{longtable}
\usepackage{pst-node}

\begin{document}

\setlength{\arrayrulewidth}{0.1mm}
\setlength{\tabcolsep}{14pt}
\renewcommand{\arraystretch}{1.3}

\begin{longtable}{|c p{0.8em}|l|l|l|@{\qquad}p{0.4em}@{\qquad}c|}\hline
    &  & \textit{Section Tag} & \textit{Opcode} & \textit{Branch} &  & \qquad\\
    \hline
    \hline
    \endfirsthead
    \endhead
    \hline
    \endlastfoot
    
     &0 & &\texttt{people search} &\texttt{people finder} &\rnode{a0a}{\texttt{2}} & \\ 
    \hline 
     & \rnode{a1}{1} & &\texttt{daily motion} & & \rnode{a1a}{345} & \\ 
    \hline 
     & \rnode{a2}{2} &\texttt{monila} &\texttt{faradays low} & & \rnode{a2a}{1} & \\ 
    \hline 
     & \rnode{a3}{3} & &\texttt{ohms lawyer} & & \rnode{a3a}{22} & \\ 
    \hline 
     & \rnode{a4}{4} &\texttt{fafral} &\texttt{gpu work)} & & \rnode{a4a}{333} & \\ 
    \hline 
     &5 &\texttt{find} &\texttt{internally fit} & & \rnode{a5a}{4444} &\\\hline 
\end{longtable}
\ncbar[nodesep=1mm,armA=2cm]{->}{a0a}{a1a}
\ncbar[nodesep=1mm,armA=2cm]{->}{a2a}{a3a}
\ncbar[nodesep=1mm,armA=2cm,angle=180]{->}{a1}{a2}
\ncbar[nodesep=1mm,armA=2cm,angle=180]{->}{a3}{a4}
\end{document}

使用 lualatex 运行

在此处输入图片描述

相关内容