在下面的 MWE 中,我想在水平箭头的尖端添加一个 $t$,在垂直箭头的尖端添加一个 $x$。
我还希望箭头能够自动与斜线框相交。这是通过反复试验实现的。换句话说,如果表格中有 ac|c 和 \hline,我想用箭头替换惯用的垂直和水平线分隔符。
实际的表格中填充了公式,而且更大。
\documentclass{article}
\usepackage{tikz}
\usepackage{diagbox}
\usetikzlibrary{calc,arrows}
\newcommand{\tikzmark}[1]{%
\tikz[overlay,remember picture] \node (#1) {};}
\begin{document}
\begin{table}
\begin{center}
\begin{tabular}{c c c c c c c}
\diagbox{$i$}{$j$} \tikzmark{a}& $0$ & $1$ & $2$ & $3$ & $4$ & $5$ \\
\tikzmark{c}&&&&&& \tikzmark{d}\\
-2& . & .&. &. & . & . \\
-1& . &. &. &. & . & . \\
0& .& . &. &.&. & . \\
1& .&.& . & . & . &. \\
2& .&. & .& .& . & . \\
3 \tikzmark{b}& .& .&. & .& .&.\\
\end{tabular}
\end{center}
\end{table}
\tikz[overlay,remember picture] \draw[-triangle 45] ($(c.north east)+
(-0.9,0.15)$) -- ($(d.north west)+(0.7,0.15)$);
\tikz[overlay,remember picture] \draw[-triangle 45] ($(a.north)+(0.25,0.5)$)
-- ($(b.south)+(0.45,-0.2)$);
\end{document}
答案1
以下是一种方法。
我在战略要点放置了一些参考“tikzmarks”:
t
在表格顶部(通过\tikzmark
在表格前一行使用)b
在表格底部(通过\tikzmark
在表格后的一行中使用)l
在表格左侧(通过\tikzmkark
在表格前使用)r
在表格右侧(使用\tikzmark
表格后面的)x
在对角线的末端。这是比较棘手的。我在表格标题后使用了额外的一行,但没有垂直空间(通过\\[-8pt]
在标题后使用),并在第二列中放置了一个左对齐的单元格,没有填充(通过使用\multicolumn{1}{@{}l}{}
,以及该单元格内的 tikzmark)。
下图显示了这些战略要点的布局:
上图是由以下代码生成的:
\documentclass{article}
\usepackage{tikz}
\usepackage{diagbox}
\usetikzlibrary{calc,arrows}
\newcommand{\tikzmark}[1]{%
\tikz[overlay,remember picture] \coordinate (#1) {};}
\begin{document}
\begin{table}
\begin{center}
\tikzmark{t}\\
\tikzmark{l}
\begin{tabular}{c c c c c c c}
\diagbox{$i$}{$j$}& $0$ & $1$ & $2$ & $3$ & $4$ & $5$\\[-8pt]
& \multicolumn{1}{@{}l}{\tikzmark{x}}\\
-2 & . & . & . & . & . & . \\
-1 & . & . & . & . & . & . \\
0 & . & . & . & . & . & . \\
1 & . & . & . & . & . & . \\
2 & . & . & . & . & . & . \\
3 & . & . & . & . & . & . \\
\end{tabular}\tikzmark{r}\\
\tikzmark{b}
\end{center}
\end{table}
\tikz[overlay, remember picture] {
\fill[red] (l) circle(2pt) node[left] {l};
\fill[red] (r) circle(2pt) node[right] {r};
\fill[red] (x) circle(2pt) node[below right] {x};
\fill[red] (t) circle(2pt) node[above] {t};
\fill[red] (b) circle(2pt) node[below] {b};
}
\end{document}
一旦这些战略要点到位,您就可以使用语法(t-|l)
来引用与“顶部”水平对齐并与“左侧”垂直对齐的坐标。这将是表格的左上角。
适当地将此语法与点一起使用l
,r
即可x
绘制水平箭头。使用t
,b
即可x
绘制垂直箭头。如下所示:
\tikz[overlay,remember picture] \draw[-triangle 45] (x-|l) -- (x-|r) node[right] {$t$};
\tikz[overlay,remember picture] \draw[-triangle 45] (t-|x) -- (b-|x) node[below] {$x$};
要得到:
更新
在问题的一个版本中,OP 添加了在表格中添加其他垂直或水平规则的可能性,也可以用箭头代替。
上述方法可以扩展到这种情况。您必须在想要水平箭头位于下方的行(而不是放在\hrule
这些行后面)以及想要垂直箭头位于前方的列(而不是在|
它们前面放置格式表声明)处放置额外的 tikzmark。
为了简化这一点,可以定义以下宏:
\newcommand{\columnmark}[1]{%
\multicolumn{1}{@{}l}{\tikzmark{#1}}
}
\newcommand{\rowmark}[1]{%
\\[-8pt]\tikzmark{#1}
}
例如可以像这样定义两个控制点(c1
和c2
)在某些列前添加垂直箭头,两个控制点(r1
和r2
)在某些行后添加水平箭头:
\begin{table}
\begin{center}
\tikzmark{t}\\
\tikzmark{l}
\begin{tabular}{c c c c c c c c c }
\diagbox{$i$}{$j$}& $0$ & $1$ & $2$ & $3$ & $4$ & $5$\\[-8pt]
& \columnmark{x} & & & \columnmark{c1} & & & \columnmark{c2} & \\
-2 & . & . & . & . & . & . \\
-1 & . & . & . & . & . & . \\
0 & . & . & . & . & . & . \rowmark{r1}\\
1 & . & . & . & . & . & . \\
2 & . & . & . & . & . & . \\
3 & . & . & . & . & . & . \rowmark{r2}\\
\\
\end{tabular}\tikzmark{r}\\
\tikzmark{b}
\end{center}
\end{table}
然后,您可以使用已经看到的语法绘制箭头(X-|Z)
。在本例中:
\tikz[overlay,remember picture] {
\draw[-triangle 45] (x-|l) -- (x-|r) node[right] {$t$};
\draw[-triangle 45] (t-|x) -- (b-|x) node[below] {$x$};
\draw[-triangle 45] (r1-|l) -- (r1-|r);
\draw[-triangle 45] (r2-|l) -- (r2-|r);
\draw[-triangle 45] (t-|c1) -- (b-|c1);
\draw[-triangle 45] (t-|c2) -- (b-|c2);
}
将产生: