单元格之间带有箭头的表格

单元格之间带有箭头的表格

我想创建一个表格,其中某些单元格之间有箭头,为此我使用了tabularx和 TkiZ。我遇到了以下问题:

  • 单元格中的文本垂直对齐到中心并处于同一高度(TikZ 节点不与同一行中的正常单元格文本内联)。
  • 无法与中心对齐\begin{center}•\end{center}
  • 我不知道如何修复单元格的大小。

这是我目前拥有的:

代码

\documentclass{article}
\usepackage{tabularx}
\usepackage{tikz}
\tikzset{every picture/.style={remember picture}}
\begin{document}
\begin{tabularx}{\textwidth}{r|c|c|c|c|l}
    &$D_1$&$D_2$&$D_3$&$D_4$&foo\\ \cline{1-6}
    $O_1$&\tikz[baseline]{\node (a11) {50};}&\tikz[baseline]{\node (a12) {0};}&&&50\\[2em] \cline{1-6}
    $O_2$&&\tikz[baseline]{\node (a22) {60};}&&&60\\[2em] \cline{1-6}
    $O_3$&&\tikz[baseline]{\node (a32) {10};}&\tikz[baseline]{\node (a33) {30};}&\tikz[baseline]{\node (a34) {10};}&50\\[2em] \cline{1-6}
    $O_4$&&&&\tikz[baseline]{\node (a44) {50};}&50\\[2em] \cline{1-6}
    bar&50&70&30&60&210\\
\end{tabularx}
\begin{tikzpicture}[overlay]
    \path[thick,->] (a11) edge (a12);
    \path[thick,->] (a12) edge (a22);
    \path[thick,->] (a22) edge (a32);
    \path[thick,->] (a32) edge (a33);
    \path[thick,->] (a33) edge (a34);
    \path[thick,->] (a34) edge (a44);
\end{tikzpicture}
\end{document}

输出

此外,我还收到以下警告:

\hbox第 13-13 行对齐不足(badness 10000)

\hbox段落第 13-22 行过满(宽 15.0pt)

答案1

另一个可能的解决方案是使用 OP 代码但稍作修改。通过在最后一列添加 X 列来解决未满问题,这样就\textwidth满足了。

tikz单元格中的OP结构被重新定义为tikzmark采用两个参数,并通过\link宏连接。

创建具有水平和垂直居中的新列类型 M:

\renewcommand\tabularxcolumn[1]{m{#1}}
\newcolumntype{M}{>{\centering\arraybackslash}m{1cm}}

在此处输入图片描述

代码

\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{tabularx}
\usepackage{tikz}
%\tikzset{every picture/.style={remember picture}}

\renewcommand\tabularxcolumn[1]{m{#1}}
\newcolumntype{M}{>{\centering\arraybackslash}m{1cm}}

\newcommand\tikzmark[2]{%
\tikz[remember picture,baseline] \node[inner sep=2pt,outer sep=0] (#1){#2};%
}

\newcommand\link[2]{%
\begin{tikzpicture}[remember picture, overlay, >=stealth, shift={(0,0)}]
  \draw[->] (#1) to (#2);
\end{tikzpicture}%
}

\begin{document}

\noindent
\begin{tabularx}{\textwidth}{M|M|M|M|M|MX}
         &$D_1$           &$D_2$           &$D_3$    &$D_4$& foo  &\\ \cline{1-6}
    $O_1$&\tikzmark{a}{50}&\tikzmark{b}{0} &         &     & 50   &\\[2em] \cline{1-6}
    $O_2$&                &\tikzmark{c}{60}&         &     &60 &\\[2em] \cline{1-6}
    $O_3$&                &\tikzmark{d}{10}&\tikzmark{e}{30}&\tikzmark{f}{10}&50 &\\[2em] \cline{1-6}
    $O_4$&                &                &         &\tikzmark{g}{50}&{50} &\\[2em] \cline{1-6}
    bar&50&70&30&60&210  \\ 
\end{tabularx}

\link{a}{b}
\link{b}{c} 
\link{c}{d}
\link{d}{e} 
\link{e}{f} 
\link{f}{g}
\end{document}

答案2

我建议您将整个矩阵绘制为TikZ matrix;这可让您轻松控制单元格的属性(我只是可选地添加了一些颜色):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\tikzset{ 
table/.style={
  matrix of nodes,
  row sep=-\pgflinewidth,
  column sep=-\pgflinewidth,
  nodes={rectangle,text width=3em,align=center},
  text depth=1.25ex,
  text height=2.5ex,
  nodes in empty cells
},
row 1/.style={nodes={fill=green!10,text depth=0.4ex,text height=2ex}},
row 6/.style={nodes={text depth=0.4ex,text height=2ex}},
column 1/.style={nodes={fill=green!10}},
}

\begin{document}

\begin{tikzpicture}
% the matrix entries
\matrix (mat) [table]
{
& $D_1$ & $D_2$ & $D_3$ & $D_4$ & foo \\
$O_1$ & 50  & 0 & & & 50 \\
$O_2$ & & 60 & & & 60 \\
$O_3$ & & 10 & 30 & 10 & 50 \\
$O_4$ & & & & 50 & 50 \\
bar & 50 & 70 & 30 & 60 & 210 \\
};
% the matrix rules
\foreach \x in {1,...,5}
{
  \draw 
    ([xshift=-.5\pgflinewidth]mat-\x-1.south west) --   
    ([xshift=-.5\pgflinewidth]mat-\x-6.south east);
  }
\foreach \x in {1,...,5}
{
  \draw 
    ([yshift=.5\pgflinewidth]mat-1-\x.north east) -- 
    ([yshift=.5\pgflinewidth]mat-6-\x.south east);
}    
% the arrows
\begin{scope}[shorten >=7pt,shorten <= 7pt]
\draw[->]  (mat-2-2.center) -- (mat-2-3.center);
\draw[->]  (mat-2-3.center) -- (mat-3-3.center);
\draw[->]  (mat-3-3.center) -- (mat-4-3.center);
\draw[->]  (mat-4-3.center) -- (mat-4-4.center);
\draw[->]  (mat-4-4.center) -- (mat-4-5.center);
\draw[->]  (mat-4-5.center) -- (mat-5-5.center);
\end{scope}
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案3

以下是使用圈数和堆栈来实现此目的的一种方法:

\documentclass{article}
\usepackage{tabularx}
\usepackage{graphicx}
\usepackage{stackengine}
\def\RA{\rlap{\scalebox{1.6}{$\rightarrow$}}}
\def\DA{\bclap{\scalebox{1.6}{$\downarrow$}}}
\def\mystrut{\rule{0ex}{3ex}}
\begin{document}
\setstackgap{S}{6pt}
\begin{tabularx}{\textwidth}{r|c|c|c|c|l}
    &$D_1$&$D_2$&$D_3$&$D_4$&foo\\ \cline{1-6}
    \mystrut$O_1$&50\RA&\stackunder{0}{\DA}&&&50\\[2em] \cline{1-6}
    \mystrut$O_2$&&\stackunder{60}{\DA}&&&60\\[2em] \cline{1-6}
    \mystrut$O_3$&&10\RA&30\RA&\stackunder{10}{\DA}&50\\[2em] \cline{1-6}
    \mystrut$O_4$&&&&50&50\\[2em] \cline{1-6}
    \mystrut bar&50&70&30&60&210\\
\end{tabularx}
\end{document}

在此处输入图片描述

下面是另一种呈现方式:

\documentclass{article}
\usepackage{tabularx}
\usepackage{graphicx}
\usepackage{stackengine}
\def\RA{\rlap{\scalebox{1.6}{$\rightarrow$}}}
\def\DA{\smash{\bclap{\scalebox{1.6}{$\downarrow$}}}}
\def\mystrut{\rule[-2ex]{0ex}{6ex}}
\begin{document}
\setstackgap{S}{6pt}
\setstackgap{L}{7pt}
\begin{tabularx}{\textwidth}{r|c|c|c|c|l}
    &$D_1$&$D_2$&$D_3$&$D_4$&foo\\ \cline{1-6}
    \mystrut$O_1$&50\RA&\stackunder{0}{\DA}&&&50\\ \cline{1-6}
    \mystrut$O_2$&&\stackunder{60}{\DA}&&&60\\ \cline{1-6}
    \mystrut$O_3$&&10\RA&30\RA&\stackunder{10}{\DA}&50\\ \cline{1-6}
    \mystrut$O_4$&&&&50&50\\ \cline{1-6}
    \mystrut bar&50&70&30&60&210\\
\end{tabularx}
\end{document}

在此处输入图片描述

答案4

使用{NiceTabular}nicematrixTikZ 绘制箭头。

\documentclass{article}
\usepackage{nicematrix,tikz}
\usetikzlibrary{arrows.meta}

\begin{document}

\begin{center}
\setlength{\tabcolsep}{0pt}
\begin{NiceTabular}
   [columns-width=1cm,hvlines-except-borders]
   {>{\rule[-4mm]{0pt}{1cm}}*{6}{c}}
         & $D_1$ & $D_2$ & $D_3$ & $D_4$ & foo \\
   $O_1$ & 50  & 0 & & & 50 \\
   $O_2$ & & 60 & & & 60 \\
   $O_3$ & & 10 & 30 & 10 & 50 \\
   $O_4$ & & & & 50 & 50 \\
   bar & 50 & 70 & 30 & 60 & 210 \\
\CodeAfter
   \begin{tikzpicture} [->, shorten < = 1mm, shorten > = 1mm]
   \draw (2-2) -- (2-3) ;
   \draw (2-3) -- (3-3) ; 
   \draw (3-3) -- (4-3) ; 
   \draw (4-3) -- (4-4) ; 
   \draw (4-4) -- (4-5) ; 
   \draw (4-5) -- (5-5) ; 
   \end{tikzpicture}
\end{NiceTabular}
\end{center}

\end{document}

上述代码的输出

相关内容