假设我有一张 4 列 8 行的表格。最上面一行是下面每行的标签。假设我希望第 4 行和第 5 行的单元格边框比表格中其他单元格的边框更粗。有没有办法在 LaTeX 中实现这一点?
\begin{table*}[ht]
{\normalsize
\hfill{}
\large
\begin{tabular}{|c|c|c|c|c|}
\hline \bf ID & \bf Raw Score & \bf Num & \bf Total Hits & \bf Avg \\
\hline 217842950 & 8282 & 9 & 10059 & 0.176658 \\
\hline 264307945 & 7700 & 13 & 11076 & 0.304803 \\
\hline 111824111 & 6170 & 16 & 9467 & 0.348262 \\
\hline 331180650 & 1705 & 31 & 2668 & 0.360945 \\
\hline 436114131 & 1540 & 6 & 1773 & 0.131416 \\
\hline 546694115 & 1460 & 6 & 1685 & 0.133531 \\
\hline 467026458 & 1058 & 36 & 1237 & 0.144705 \\
\hline
\end{tabular} }
\hfill{}
\caption{Scores for the top-7 IDs .}
\label{tb:tablename}
\end{table*}
上面是我的表格。我不确定如何更改任何行(或单元格)周围的边框
答案1
这里有一个简单的例子;我们的想法是使用\noalign{\hrule height <length>}
而不是\hline
来获得由 给出的厚度的水平规则<length>
;对于垂直规则,不跨越整个表格,我们的想法是使用 \multicolumn 并在第二个参数中使用!{\vrule width <length>}
而不是来获得该单元格|
厚度的垂直规则(最后一个构造需要该包):<length>
array
\documentclass{article}
\usepackage{array}
\begin{document}
\begin{tabular}{|c|c|}
\hline
column1a & column2a \\
\noalign{\hrule height 2pt}
\multicolumn{1}{!{\vrule width 2pt}c!{\vrule width 1pt}}{column1b} &
\multicolumn{1}{!{\vrule width 1pt}c!{\vrule width 2pt}}{column2b} \\
\noalign{\hrule height 2pt}
column1c & column2c \\
\hline
\end{tabular}
\end{document}
下面是您的表格的一个示例:
\documentclass{article}
\usepackage{array}
\begin{document}
\begin{table*}
{\normalsize
\hfill{}
\large
\begin{tabular}{|c|c|c|c|c|}
\hline \bf ID & \bf Raw Score & \bf Num & \bf Total Hits & \bf Avg \\
\hline 217842950 & 8282 & 9 & 10059 & 0.176658 \\
\hline 264307945 & 7700 & 13 & 11076 & 0.304803 \\
\noalign{\hrule height 2pt}
\multicolumn{1}{!{\vrule width 2pt}c!{\vrule width 1pt}}{111824111} &
\multicolumn{1}{!{\vrule width 1pt}c!{\vrule width 1pt}}{6170} &
\multicolumn{1}{!{\vrule width 1pt}c!{\vrule width 1pt}}{16} &
\multicolumn{1}{!{\vrule width 1pt}c!{\vrule width 1pt}}{9467} &
\multicolumn{1}{!{\vrule width 1pt}c!{\vrule width 2pt}}{0.348262} \\
\noalign{\hrule height 2pt}
\multicolumn{1}{!{\vrule width 2pt}c!{\vrule width 1pt}}{331180650} &
\multicolumn{1}{!{\vrule width 1pt}c!{\vrule width 1pt}}{1705} &
\multicolumn{1}{!{\vrule width 1pt}c!{\vrule width 1pt}}{31} &
\multicolumn{1}{!{\vrule width 1pt}c!{\vrule width 1pt}}{2668} &
\multicolumn{1}{!{\vrule width 1pt}c!{\vrule width 2pt}}{0.360945} \\
\noalign{\hrule height 2pt}
436114131 & 1540 & 6 & 1773 & 0.131416 \\
\hline 546694115 & 1460 & 6 & 1685 & 0.133531 \\
\hline 467026458 & 1058 & 36 & 1237 & 0.144705 \\
\hline
\end{tabular} }
\hfill{}
\caption{Scores for the top-7 IDs .}
\label{tb:tablename}
\end{table*}
\end{document}
当然,你可以定义宏,例如:
\newcommand\Thickvrule[1]{%
\multicolumn{1}{!{\vrule width 2pt}c!{\vrule width 1pt}}{#1}%
}
然后使用
\Thickvrule{6170}
在您的文档中。
对于某些细胞,\cline
可以定义具有所需厚度的变体:
\documentclass{article}
\usepackage{array}
\newlength\Origarrayrulewidth
\newcommand{\Cline}[1]{%
\noalign{\global\setlength\Origarrayrulewidth{\arrayrulewidth}}%
\noalign{\global\setlength\arrayrulewidth{2pt}}\cline{#1}%
\noalign{\global\setlength\arrayrulewidth{\Origarrayrulewidth}}%
}
\newcommand\Thickvrule[1]{%
\multicolumn{1}{!{\vrule width 2pt}c!{\vrule width 2pt}}{#1}%
}
\begin{document}
\begin{table*}
\setlength\extrarowheight{3pt}
\large
\centering
\begin{tabular}{|c|c|c|c|c|}
\hline \bf ID & \bf Raw Score & \bf Num & \bf Total Hits & \bf Avg \\
\hline 217842950 & 8282 & 9 & 10059 & 0.176658 \\
\Cline{1-1}\cline{2-5}
\Thickvrule{264307945} & 7700 & 13 & 11076 & 0.304803 \\
\Cline{1-1}\cline{2-4}\Cline{4-4}\cline{4-5}
111824111 & 6170 & 16 & \Thickvrule{9467} & 0.348262 \\
\cline{1-4}\Cline{4-4}\cline{4-5}
331180650 & 1705 & 31 & 2668 & 0.360945 \\
\hline 436114131 & 1540 & 6 & 1773 & 0.131416 \\
\cline{1-2}\Cline{2-2}\cline{3-5}
546694115 & \Thickvrule{1460} & 6 & 1685 & 0.133531 \\
\cline{1-2}\Cline{2-2}\cline{3-5}
467026458 & 1058 & 36 & 1237 & 0.144705 \\
\hline
\end{tabular}
\caption{Scores for the top-7 IDs .}
\label{tb:tablename}
\end{table*}
\end{document}
还有一些针对多个单元格的情况的宏:
\documentclass{article}
\usepackage{array}
\newlength\Origarrayrulewidth
% horizontal rule equivalent to \cline but with 2pt width
\newcommand{\Cline}[1]{%
\noalign{\global\setlength\Origarrayrulewidth{\arrayrulewidth}}%
\noalign{\global\setlength\arrayrulewidth{2pt}}\cline{#1}%
\noalign{\global\setlength\arrayrulewidth{\Origarrayrulewidth}}%
}
% draw a vertical rule of width 2pt on both sides of a cell
\newcommand\Thickvrule[1]{%
\multicolumn{1}{!{\vrule width 2pt}c!{\vrule width 2pt}}{#1}%
}
% draw a vertical rule of width 2pt on the left side of a cell
\newcommand\Thickvrulel[1]{%
\multicolumn{1}{!{\vrule width 2pt}c|}{#1}%
}
% draw a vertical rule of width 2pt on the right side of a cell
\newcommand\Thickvruler[1]{%
\multicolumn{1}{|c!{\vrule width 2pt}}{#1}%
}
\begin{document}
\begin{table*}
\setlength\extrarowheight{3pt}
\centering
\large
\begin{tabular}{|c|c|c|c|c|}
\hline \bf ID & \bf Raw Score & \bf Num & \bf Total Hits & \bf Avg \\
\hline 217842950 & 8282 & 9 & 10059 & 0.176658 \\
\Cline{1-1}\cline{2-5}
\Thickvrule{264307945} & 7700 & 13 & 11076 & 0.304803 \\
\Cline{1-1}\cline{2-4}\Cline{4-4}\cline{4-5}
111824111 & 6170 & 16 & \Thickvrule{9467} & 0.348262 \\
\cline{1-4}\Cline{4-4}\cline{4-5}
331180650 & 1705 & 31 & 2668 & 0.360945 \\
\cline{1-2}\Cline{2-2}\cline{3-5}
436114131 & \Thickvrule{1540} & 6 & 1773 & 0.131416 \\
\cline{1-2}\Cline{2-2}\cline{3-5}
546694115 & 1460 & 6 & 1685 & 0.133531 \\
\Cline{1-5}
\Thickvrulel{467026458} & 1058 & 36 & 1237 & \Thickvruler{0.144705} \\
\Cline{1-5}
\end{tabular}
\caption{Scores for the top-7 IDs .}
\label{tb:tablename}
\end{table*}
\end{document}
最后,附注一下,您应该考虑不要在表格中使用垂直线(当然,这只是一个建议);借助booktabs
包您可以轻松制作漂亮的表格。
答案2
这更像是一种咆哮,而不是一种回答。
我确实希望 LaTeX 有一个将内容与显示分开的表格机制。例如,这是在 ConTeXt 中实现相同效果的方法:
\startsetups table:highlight
\setupTABLE[each][each][align=middle,loffset=2pt, roffset=2pt]
\setupTABLE[row][first][style=bold]
\setupTABLE[row][3,4] [rulethickness=2pt]
\stopsetups
\starttext
\startTABLE[setups=table:highlight]
\NC ID \NC Raw Score \NC Num \NC Total Hits \NC Avg \NC \NR
\NC 217842950 \NC 8282 \NC 9 \NC 10059 \NC 0.176658 \NC \NR
\NC 264307945 \NC 7700 \NC 13 \NC 11076 \NC 0.304803 \NC \NR
\NC 436114131 \NC 1540 \NC 6 \NC 1773 \NC 0.131416 \NC \NR
\NC 546694115 \NC 1460 \NC 6 \NC 1685 \NC 0.133531 \NC \NR
\NC 467026458 \NC 1058 \NC 36 \NC 1237 \NC 0.144705 \NC \NR
\stopTABLE
\stoptext
在幕后,ConTeXt 正在做一些与 Gonzalo Medina 的解决方案类似的事。但它提供了一个不错的键值驱动界面,可以向用户隐藏详细信息。
答案3
使用该包nicematrix
,您可以定义以下新命令\Frame
:
\NewDocumentCommand{\Frame}{}{\Block[draw , line-width=2pt]{1-1}{}}
然后在环境内的单元中使用它NiceTabular
:
\Frame{cell content}
答案4
{NiceTabular}
在的环境下nicematrix
。
在该环境中,内置命令\Block
用于合并单元格并格式化生成的矩形。但是,也可以将其用于单个单元格。
这就是我们使用其键 所做的tikz
。每次使用该键时,单元格的矩形都会在 Tikz 中使用作为 参数提供的键tikz
。
使用tikz=clip
,我们剪切到单元格的矩形。
使用tikz={draw,line width=2pt}
,我们绘制框架。
\Frame
我们已经编写了一个完成该工作的命令。
内置命令\RowStyle
(的nicematrix
) 将其参数应用于行的每个单元格。
\documentclass{article}
\usepackage{nicematrix,tikz}
\begin{document}
\NewDocumentCommand{\Frame}{}{\Block[tikz={draw,offset=0.5pt,line width= 1pt}]{1-1}{}}
\begin{NiceTabular}{ccccc}[hvlines]
\RowStyle{\bfseries}
ID & Raw Score & Num & Total Hits & Avg \\
217842950 & 8282 & 9 & 10059 & 0.176658 \\
\Frame 264307945 & 7700 & 13 & 11076 & 0.304803 \\
111824111 & 6170 & 16 & 9467 & 0.348262 \\
331180650 & 1705 & 31 & 2668 & 0.360945 \\
\RowStyle{\Frame}
436114131 & 1540 & 6 & 1773 & 0.131416 \\
546694115 & 1460 & 6 & 1685 & 0.133531 \\
467026458 & 1058 & 36 & 1237 & 0.144705 \\
\end{NiceTabular}
\end{document}
您需要多次编译(因为nicematrix
在后台使用 PGF/Tikz 节点)。