我有这个 LaTeX 代码
\documentclass{article}
\usepackage{diagbox}
\usepackage{amsmath,array,graphicx}
\begin{document}
\begin{table}[htb]
\centering
\caption{Classifiaction}
\label{table:cc}
\resizebox{\columnwidth}{!}{%
\begin{tabular}{|c||*{1}{c|}|p{0.4\textwidth}|*{2}{c|}}\hline
\backslashbox{Classification}{Model}
& Model 1 & Model 2 & Model 3 & Model 4\\\hline\hline
Class & Class 1 & \begin{itemize}
\item Class 1 if $A=B$
\item Class 2 otherwise
\end{itemize} & Class 2 & Class 2\\\hline
Method & Method 1 & Method 2 & Method 1 & Method 2\\\hline
Time & Constant & Linear & Polylogarithmic & Exponential \\\hline
\end{tabular}
}
\end{table}
\end{document}
生成一个包含带有项目项目符号的单元格的表格。表格看起来很丑陋,因为文本不在单元格内居中,有一些无用的空间(例如在带有项目的单元格中),行间距不均匀等。
我怎样才能改进这个表格?
我曾尝试使用这种添加项目符号的方法如何在 Table 环境中使用 itemize但我没有成功,即当我使用\tabitem ....\\ \tabitem ...
新项目时它不在同一个单元格中而是在新行中。
答案1
我会按照以下形式重新设计您的表格:
(红线表示文本区域边框)
\documentclass{article}
\usepackage{booktabs, multirow}
\usepackage[skip=1ex]{caption}
\usepackage{enumitem}
\begin{document}
\begin{table}[htb]
\centering
\setlength\tabcolsep{0pt}
\caption{Classifiaction}
\label{table:cc}
\begin{tabular*}{\linewidth}{@{\extracolsep{\fill}} *{2}{l} p{0.28\textwidth} *{2}{l} }
\toprule
\multirow{2.2}{*}{Classification}
& \multicolumn{4}{c}{Model} \\
\cmidrule{2-5}
& Model 1 & Model 2 & Model 3 & Model 4 \\
\midrule
Class & Class 1 & \begin{itemize}[nosep, leftmargin=*,
before=\vspace{-0.6\baselineskip},
after =\vspace{-\baselineskip}
]
\item Class 1 if $A=B$
\item Class 2 otherwise
\end{itemize}
& Class 2 & Class 2 \\ \midrule
Method & Method 1 & Method 2 & Method 1 & Method 2 \\ \midrule
Time & Constant & Linear & Polylogarithmic & Exponential \\
\bottomrule
\end{tabular*}
\end{table}
\end{document}
如您所见,\diagbox
被“模型”的新行替换,“分类”被放入multirow
单元格中。
对于表格使用环境tabular*
,其宽度等于文本宽度;对于列表使用enumitem
包。垂直线被删除,对于水平线使用包中的规则booktabs
。
答案2
您不应该将\resizebox
和 一起使用——它会导致字体大小不一致。我建议使用\small
字体大小、减小的\tabcolsep
和更合适的文本宽度以及geometry
包和tabularx
使表格适合边距之间的解决方案。我减小了第一列的宽度,使用了height
和width
的参数\diagbox
。对于 liqst 问题,我认为它在单元格的左边框处左对齐看起来会更好,并且没有垂直间距。最后,我将其替换\hline
为\ hhline
以使垂直和水平规则之间的交叉点更好。
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{amsmath, graphicx}
\usepackage{diagbox}
\usepackage{array, caption, tabularx, hhline}
\usepackage{enumitem}
\makeatletter
\newcommand*{\compress}{\@minipagetrue}
\makeatother
\begin{document}
\begin{table}[htb]
\centering\small
\setlength{\extrarowheight}{2pt}
\caption{Classification}
\setlength{\tabcolsep}{2pt}
\label{table:cc}
\begin{tabularx}{\linewidth}{|c||*{1}{c|}| >{\compress}X|*{2}{c|}}
\hhline{-||-||---}
\diagbox[height=7ex, width=9em]{Classification}{\raisebox{-1.6ex}{Model}}
& Model 1 & Model 2 & Model 3 & Model 4\\
\hhline{=::=::===}
Class & Class 1 & \begin{itemize}[wide=0pt, leftmargin=*, topsep=0pt, itemsep =0pt, after=\vspace{-\baselineskip}]
\item Class 1 if $A=B$
\item Class 2 otherwise
\end{itemize} & Class 2 & Class 2\\
\hhline{-||-||---}
Method & Method 1 & Method 2 & Method 1 & Method 2\\
\hhline{-||-||---}
Time & Constant & Linear & Polylogarithmic & Exponential \\
\hhline{-||-||---}
\end{tabularx}
\end{table}
\end{document}
答案3
像这样:
\documentclass{article}
\usepackage{diagbox}
\usepackage{amsmath,array,graphicx}
\begin{document}
\renewcommand*{\arraystretch}{2}
\begin{table}[htb]
\centering
\caption{Classifiaction}
\label{table:cc}
\resizebox{\columnwidth}{!}{%
\begin{tabular}{|c||*{1}{c|}|>\centering m{0.4\textwidth}|*{2}{c|}}\hline
\backslashbox{Classification}{Model}
& Model 1 & Model 2 & Model 3 & Model 4\\\hline\hline
Class & Class 1 & \begin{itemize}
\item Class 1 if $A=B$
\item Class 2 otherwise
\end{itemize} & Class 2 & Class 2\\\hline
Method & Method 1 & Method 2 & Method 1 & Method 2\\\hline
Time & Constant & Linear & Polylogarithmic & Exponential \\\hline
\end{tabular}
}
\end{table}
\end{document}
答案4
以下解决方案似乎可以提供您想要的东西:
我所做的事情有三个关键:
- 在制作表格之前,我已将列表保存在框中。然后,在表格中,我可以应用
\usebox
框来获取已格式化的内容。通过这样做,我可以使第三列居中(正如您想要的那样)。使用可minipage
删除列表前后不需要的空白itemize
(前提是列表外没有内容)。 - 通过使用
\raisebox
,我基本上能够给出在上方和下方添加空白缓冲区的外观列表。这有点用词不当,因为我实际上做的只是告诉 LaTeX,盒子的高度和深度比实际要大一点。语法\raisebox
是
\raisebox{<lift>}
[<optional height specification>]
[<optional depth specification>]
{<content>}
- 我用支柱对间距进行一些控制。
代码如下:
\documentclass{article}
\usepackage{diagbox}
\usepackage{amsmath,array,graphicx}
\newcommand\aestrut[2]{\rule[#1]{0pt}{1pt}%%
\rule[#2]{0pt}{1pt}}
\newcommand\fixedstrut{\aestrut{2.5ex}{-1.5ex}}
\begin{document}
\newsavebox\aebox
\begin{lrbox}\aebox
\begin{minipage}{0.4\textwidth-6pt}
\begin{itemize}
\item Class 1 if $A=B$
\item Class 2 otherwise
\end{itemize}
\end{minipage}%%
\end{lrbox}
\begin{table}[htb]
\centering
\caption{Classifiaction\aestrut{0pt}{-2ex}}
\label{table:cc}
\resizebox{\columnwidth}{!}{%
\begin{tabular}{|c||*{1}{c|}|c|*{2}{c|}}\hline
\backslashbox{\fixedstrut Classification}
{\fixedstrut Model} &
Model 1 &
Model 2 &
Model 3 &
Model 4
\\\hline\hline
Class &
Class 1 &
\raisebox{0pt}[\height+2ex][\depth+2.5ex]{\usebox{\aebox}}
&
Class 2 &
Class 2
\\\hline
\aestrut{3ex}{-2ex}%%
Method &
Method 1 &
Method 2 &
Method 1 &
Method 2
\\\hline
\aestrut{3ex}{-2ex}%%
Time &
Constant &
Linear &
Polylogarithmic &
Exponential
\\\hline
\end{tabular}
}
\end{table}
\end{document}