![在表格列上绘制垂直箭头](https://linux22.com/image/256477/%E5%9C%A8%E8%A1%A8%E6%A0%BC%E5%88%97%E4%B8%8A%E7%BB%98%E5%88%B6%E5%9E%82%E7%9B%B4%E7%AE%AD%E5%A4%B4.png)
我想在表格列的中心画一个箭头,如下所示。我该怎么做?
答案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
列(以及列)。当使用此列类型时R
,L
列会自动用\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}
会产生第三个黑色箭头:
笔记:
- 此自动化解决方案假设您将至少绘制一箭头,无论何时使用
C
、R
或L
列类型。如果没有这个,对列进行编号的计数器将不会重置。否则,您可以\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}