更新

更新

在下面的 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)来引用与“顶部”水平对齐并与“左侧”垂直对齐的坐标。这将是表格的左上角。

适当地将此语法与点一起使用lr即可x绘制水平箭头。使用tb即可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}
}

例如可以像这样定义两个控制点(c1c2)在某些列前添加垂直箭头,两个控制点(r1r2)在某些行后添加水平箭头:

\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);
}

将产生:

结果

相关内容