我正在尝试创建一个覆盖多行和多列的红色框,以突出显示表格的各个部分。
我已经使用@Steven B. Slegetes 创建了一个 MWE回答这个问题。代码为:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage[table]{xcolor}
\usepackage{multirow}
%Create Red Boxes, Thanks Steven
\def\boxit#1{%
\smash{\color{red}\fboxrule=1pt\relax\fboxsep=2pt\relax%
\llap{\rlap{\fbox{\vphantom{0}\makebox[#1]{}}}~}}\ignorespaces
}
\begin{document}
\begin{table}[h]
\caption{Red Box Test}
\vspace{0.5em}
\centering
\begin{tabular}{cccc}
& A & B & C \\\toprule
I & 1 & 2 & 3 \\
\boxit{0.4in} J & 4 & 5 & 6 \\
K & 7 & 8 & 9 \\\bottomrule
\end{tabular}
\end{table}
这将创建下表:
问题:如何让它覆盖以 K 开头的行也带有 J 的行?我认为它一定与多行包有关,因此我将其包括在内。我试过尝试过,但无济于事。
答案1
一种方法是使用tikz
其tikzmark
库,它可以在页面上标记任意点,然后根据标记点的坐标绘制图片。例如:
\documentclass{article}
\usepackage{booktabs}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\begin{document}
\begin{table}[h]
\caption{Red Box Test}
\vspace{0.5em}
\centering
\begin{tabular}{cccc}
& A & B & C \\\toprule
I & 1 & 2 & 3 \\
\tikzmark{J}J & 4 & 5 & 6 \\
K & 7\tikzmark{7} & 8 & 9 \\\bottomrule
\end{tabular}
\begin{tikzpicture}[overlay,remember picture]
\draw[red] ([shift={(-1ex,2ex)}]pic cs:J) rectangle ([shift={(1ex,-0.5ex)}]pic cs:7);
\end{tikzpicture}
\end{table}
\end{document}
结果:
答案2
我有編輯这个答案是因为,从 5.5 版(2020-10-20)开始,人们不再需要\omit\CodeAfter
在这里写(现在,\CodeAfter
在所有情况下都有效)。
您可以使用{NiceTabular}
of来实现这一点nicematrix
。此环境在数组的单元格下创建 PGF/Tikz 节点,并且可以在构造数组后使用这些节点。
\documentclass{article}
\usepackage{booktabs}
\usepackage{tikz}
\usetikzlibrary{fit}
\usepackage{nicematrix}
\begin{document}
\begin{table}[h]
\caption{Red Box Test}
\vspace{0.5em}
\centering
\begin{NiceTabular}{cccc}
& A & B & C \\\toprule
I & 1 & 2 & 3 \\
J & 4 & 5 & 6 \\
K & 7 & 8 & 9 \\\bottomrule
\CodeAfter
\tikz \node [draw=red, fit = (3-1) (4-2)] { } ;
\end{NiceTabular}
\end{table}
\end{document}
答案3
@Sergei Golovan 的一个(非常)小的变体回答。从tikzmark
库中使用\tikzmarknode
宏,根据标记节点的节点绘制框:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fit, % new
tikzmark} % new
\tikzset{FIT/.style = {draw=red, thick, inner ysep=2pt, fit=#1}} % new
\usepackage{booktabs}
\usepackage[skip=0.33\lineskip]{caption} % new
\begin{document}
\begin{table}[ht]
\caption{Red Box Test}
\label{tab:redbox}
\centering
\begin{tabular}{cccc}
& A & B & C \\
\toprule
I & 1 & 2 & 3 \\
\tikzmarknode{J}J & 4 & 5 & 6 \\ % <---
K & 7\tikzmarknode{7} & 8 & 9 \\ % <---
\bottomrule
\end{tabular}
\begin{tikzpicture}[overlay,remember picture]
\node[FIT=(J) (7)] {}; % <---
\end{tikzpicture}
\end{table}
\end{document}
答案4
一个解决方案pstricks
:两个空节点和一个\psframe
连接这些节点的节点。
\documentclass[svgnames]{article}
\usepackage{graphicx}
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage[table]{xcolor}
\usepackage{multirow}
\usepackage{pst-node}
\begin{document}
\begin{table}[h]
\caption{Red Box Test}
\vspace{0.5em}
\centering
\begin{tabular}{cccc}
& A & B & C \\\toprule
I & 1 & 2 & 3 \\
\pnode[-1.5ex, 2.5ex]{A}J & 4 & 5 & 6 \\
K & 7\pnode[1.5ex, -1ex]{B} & 8 & 9 \\\bottomrule
\end{tabular}
\psframe[linecolor=Coral](A)(B)
\end{table}
\end{document}