在表格列上绘制垂直箭头

在表格列上绘制垂直箭头

我想在表格列的中心画一个箭头,如下所示。我该怎么做?

在此处输入图片描述

答案1

您需要将箭头放置在 a 中\multicolumn以删除任何tabular垂直规则。

在此处输入图片描述

\documentclass{article}
\begin{document}
\begin{tabular}{|*{8}{c|}}
  \multicolumn{1}{c}{$\downarrow$} \\ \hline
  1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 \\ \hline
  %...
\end{tabular}
\end{document}

答案2

这是强制性的解决方案,它为您提供了调整箭头尖、颜色、线条样式等方面的tikz所有固有灵活性。tikz

笔记:

  • 与所有\tikzmark解决方案一样,这确实需要运行两次。第一次确定位置,第二次进行绘图。

  • 来自\tikzmark在正文旁边添加大括号


自动化解决方案:

在早些时候手动的下面的解决方案,需要用单独的 标记要绘制箭头的每一列\tikzmark。这使得表格更难阅读。

在这个解决方案中,我使用了包裹collcell定义一个新的列类型C来替换c列(以及列)。当使用此列类型时RL列会自动用\tikzmark编号标记1,...,<numberof columns>。因此,表格只需要看起来像:

\begin{tabular}{|CCCCCCLR|}\hline
  1 & 2 & 3 & 4 & wide text & 6 & 7 & 008 \\ \hline
  1 & 2 & 3 & 4 & 5 & 6 & wide text & 8 \\ \hline
\end{tabular}

表格之后,您可以使用\DrawArrow宏来绘制箭头任何通过使用列号作为 的参数,可以得到表中列的列表\DrawArrow。例如,\DrawArrow[-stealth]{3}会产生第三个黑色箭头:

在此处输入图片描述

笔记:

  • 此自动化解决方案假设您将至少绘制箭头,无论何时使用CRL列类型。如果没有这个,对列进行编号的计数器将不会重置。否则,您可以\ResetAddTikzMark在每个表开始之前手动调用,这将不是问题。
  • 只有特殊列类型才有编号,因此如果使用CrC,则第一C列将被编号为1,第三列将被编号2(因为第二列会自动获得)\tikzmark

进一步增强:

  • 请注意,列7使用的是L列类型。由于第一列的文本用于计算宽度(使箭头居中),因此箭头指向第一列文本的中心,这可能不是所需的结果。如果不清楚,请参阅8使用R列类型的列。

    调整他的一种方法(未经测试)是确保列文本被包裹在某种\makebox[\widthof{<widest-text-in-column>}]{}宏中。


手动解决方案:

在此版本中,您想要添加箭头的每一行顶行都需要用以下标记\tikzmark

在此处输入图片描述

参考:


代码:自动化解决方案

\documentclass{article}
\usepackage{collcell}
\usepackage{tikz}
\usetikzlibrary{calc}

\newlength{\TextWidth}
\newcommand{\tikzmark}[2]{%
    \settowidth{\TextWidth}{#2}%
    \makebox[\TextWidth]{%
        \tikz[overlay,remember picture,baseline] 
            \node [anchor=base] (#1) {#2};
    }%
}

\newcommand{\DrawArrow}[2][]{%
  \ResetAddTikzMark% Reset counter for next table
  \begin{tikzpicture}[overlay,remember picture]
    \draw[-latex, thick,#1] ($(#2.north)+(0,1.0cm)$) -- (#2.north);
  \end{tikzpicture}
}

\newcounter{ColumnCounter}
\newcommand*{\ResetAddTikzMark}{\setcounter{ColumnCounter}{0}}
\newcommand*{\AddTikzmark}[1]{%
    \stepcounter{ColumnCounter}%
    \tikzmark{\arabic{ColumnCounter}}{#1}%
}%

\newcolumntype{C}{>{\collectcell\AddTikzmark}c<{\endcollectcell}}%
\newcolumntype{R}{>{\collectcell\AddTikzmark}r<{\endcollectcell}}%
\newcolumntype{L}{>{\collectcell\AddTikzmark}l<{\endcollectcell}}%

\begin{document}
\vspace{2.0cm}
\begin{tabular}{|CCCCCCLR|}\hline
  1 & 2 & 3 & 4 & wide text & 6 & 7 & 008 \\ \hline
  1 & 2 & 3 & 4 & 5 & 6 & wide text & 8 \\ \hline
\end{tabular}
%
% Now we can draw the arrows to each of the `C` columns
\DrawArrow{1}
\DrawArrow[->]{2}
\DrawArrow[-stealth]{3}
\DrawArrow[red]{4}
\DrawArrow[blue, densely dotted]{5}
\DrawArrow[brown, thin, densely dashed]{6}
\DrawArrow[violet, ultra thick, dashed]{7}
\DrawArrow[magenta, thick, -stealth]{8}
\end{document}

代码:手动解决方案

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

\newcommand{\tikzmark}[2]{\tikz[overlay,remember picture,baseline] \node [anchor=base] (#1) {$#2$};}

\newcommand{\DrawArrow}[2][]{%
  \begin{tikzpicture}[overlay,remember picture]
    \draw[-latex, thick,#1] ($(#2.north)+(0,1.0cm)$) -- (#2.north);
  \end{tikzpicture}
}

\begin{document}
\begin{tabular}{|*{8}{c|}}\hline
  \tikzmark{A}{1} & \tikzmark{B}{2} & \tikzmark{C}{3} & \tikzmark{D}{4} & 5 & 6 & 7 & 8 \\ \hline
  1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 \\ \hline
\end{tabular}
\DrawArrow{A}
\DrawArrow[->]{B}
\DrawArrow[red]{C}
\DrawArrow[blue, dotted]{D}
\end{document}

答案3

您可以使用\multicolumn

\documentclass{article}
\usepackage{amsmath}

\begin{document}

\begin{tabular}{*{4}{|c}|}
\multicolumn{1}{c}{$\downarrow$} \\
\hline
A & B & C & D \\
\hline
\end{tabular}

\end{document}

在此处输入图片描述

相关内容