![仅当表格大于列宽时才调整其大小或缩放表格](https://linux22.com/image/340349/%E4%BB%85%E5%BD%93%E8%A1%A8%E6%A0%BC%E5%A4%A7%E4%BA%8E%E5%88%97%E5%AE%BD%E6%97%B6%E6%89%8D%E8%B0%83%E6%95%B4%E5%85%B6%E5%A4%A7%E5%B0%8F%E6%88%96%E7%BC%A9%E6%94%BE%E8%A1%A8%E6%A0%BC.png)
我在文档中有一个表格,但我不确定最终的字体大小是多少。字体大小可能是 10、11 或 12。字体大小为 10 时表格没问题,但字体大小为 11 或 12 时表格中的一个或多个太宽了。
我希望表格中有代码可以稍微缩小表格尺寸只有当它太宽时即:仅当其宽度大于列宽时。如果表格已经适合列,则应保留其原样。
是否可以在不编写大量复杂代码的情况下做到这一点。下面给出了一个说明此问题的 MWE。当字体大小变为 12 时,我希望表格向下调整到列宽:
\documentclass[10pt]{article}
\usepackage{graphics}
\usepackage[a4paper, left=50mm, right=50mm, top=50mm, bottom=50mm]{geometry}
\usepackage{caption}
\captionsetup[table]{skip=2pt}
\begin{document}
\begin{table}[H]
\centering
\caption{Elapsed Time (Seconds)}
%\resizebox{\columnwidth}{!}{%
\begin{tabular}{@{\vrule height 10.5pt depth4pt width0pt}llllllll}
& \multicolumn7c{Problem Size} \\
\cline{2-8}
Method & 2 & 10 & 90 & 250 & 900 & 2000 & 5000\\
\hline
Connoisseur & 0.5 & 3 & 21 & 49 & 120 & 323 & 600\\
Cowboy & 2 & 7 & 56 & 122 & 345 & 678 & 1545\\
Explorer & 0.5 & 2 & 19 & 45 & Crashed & Crashed & Crashed\\
Handyman & 6 & 31 & 258 & 600 & Crashed & Crashed & Crashed\\
\end{tabular} \\
\label{tab:elapsed}
\end{table}
\end{document}
正如你可能注意到的,我尝试过\resizebox
,但增加当表格宽度比列宽度窄时。
谢谢。
答案1
\resizebox
使要缩放的框的尺寸可用为\width
、\height
和\depth
。这只能用于缩放框(如果框比列宽宽)。
\documentclass[10pt]{article}
\usepackage{graphics}
\usepackage[a4paper, left=50mm, right=50mm, top=50mm, bottom=50mm]{geometry}
\usepackage{caption}
\captionsetup[table]{skip=2pt}
\usepackage{booktabs}
\usepackage{siunitx}
\begin{document}
\begin{table}
\centering
\caption{Elapsed Time (Seconds)}
\resizebox{%
\ifdim\width>\columnwidth
\columnwidth
\else
\width
\fi
}{!}{%
\begin{tabular}{
@{
\vrule height 10.5pt depth4pt width0pt\relax
\kern.5\tabcolsep
}
l
S[table-format=1.1]
S[table-format=2]
S[table-format=3]
S[table-format=3]
S[table-format=3]
S[table-format=4]
S[table-format=4]
}
& \multicolumn7c{Problem Size} \\
\cmidrule{2-8}
Method & 2 & 10 & 90 & 250 & 900 & 2000 & 5000\\
\midrule
Connoisseur & 0.5 & 3 & 21 & 49 & 120 & 323 & 600\\
Cowboy & 2 & 7 & 56 & 122 & 345 & 678 & 1545\\
Explorer & 0.5 & 2 & 19 & 45 & {Crashed} & {Crashed} & {Crashed}\\
Handyman & 6 & 31 & 258 & 600 & {Crashed} & {Crashed} & {Crashed}\\
\end{tabular}%
}
\label{tab:elapsed}
\end{table}
\end{document}
该示例使用包的水平线(具有垂直间距)
booktabs
。表中的数字按小数点标记(包
siunitx
)对齐。\\
表格后面没有跟着另一行的内容被删除。
答案2
我会将表格设计为 12 pt,以便它适合文本宽度...这样它们对于较小的字体看起来也不错:-)
梅威瑟:
\documentclass[12pt]{article}
\usepackage{graphics}
\usepackage[showframe,
a4paper, margin=50mm]{geometry}% <-- changed
\usepackage{caption}
\captionsetup[table]{skip=2pt}
\usepackage{siunitx}
\begin{document}
\begin{table}[htb]
\centering
\setlength\tabcolsep{0pt}
\caption{Elapsed Time (Seconds)}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}l
S[table-format=1.1]
S[table-format=2.0]
*{3}{S[table-format=3.0]}
*{2}{S[table-format=4.0]}
}
& \multicolumn{7}{c}{Problem Size} \\
\cline{2-8}
Method & 2 & 10 & 90 & 250 & 900 & 2000 & 5000\\
\hline
Connoisseur & 0.5 & 3 & 21 & 49 & 120 & 323 & 600\\
Cowboy & 2 & 7 & 56 & 122 & 345 & 678 & 1545\\
Explorer & 0.5 & 2 & 19 & 45 & {Crashed} & {Crashed} & {Crashed}\\
Handyman & 6 & 31 & 258 & 600 & {Crashed} & {Crashed} & {Crashed}\\
\hline
\end{tabular*}
\label{tab:elapsed}
\end{table}
\end{document}
上述 MWE 给出:
如果将字体大小减小到 10pt,则上面的 MWE 将给出:
在表格设计中我使用S
来自包的列类型siunitx
。
答案3
警告
首先,我要提醒您输出结果非常不雅观。调整文本大小后看起来会非常不一致。大多数字体不适合以 9.328 大小显示,这是有原因的,因为如果打印或显示在屏幕上,它可能会改变外观。
解释
\savebox
我们可以在打印之前使用来检查某些内容的大小。我创建了一个宏,它将给定的长度(例如\textwidth
)与某些内容(例如tabular
)进行比较。该宏将内容保存到一个框中,将其宽度存储在长度中以供日后使用,然后将此宽度与参数中给定的长度进行比较。从那里我们有选择。如果内容的宽度低于给定的长度,我们不需要调整它的大小,只需使用 显示它,\usebox
它将检索内容并显示它。另一方面,如果宽度比给定的长度宽,我们引入框的大小调整,使用\resizebox
这种方法您已经很熟悉了。
输出
代码
\documentclass[11pt]{article}
\usepackage{graphicx}
%\usepackage{showframe} % Puts a frame to see textarea and such. Enable only during testing
\usepackage{ifthen}
\usepackage[a4paper, left=50mm, right=50mm, top=50mm, bottom=50mm]{geometry}
\usepackage{caption}
\captionsetup[table]{skip=2pt}
\newsavebox{\jamBox}
\newlength{\jamWidth}
\newcommand{\jamIfToBig}[2]{%
% #1: Size to check against, like \textwidth
% #2: The content, like a tabular
\savebox{\jamBox}{#2}%
\settowidth{\jamWidth}{\usebox{\jamBox}}%
%\the\jamWidth -- \the#1
\ifthenelse{\jamWidth < #1}%
{\usebox{\jamBox}}%
{\resizebox{#1}{!}{\usebox{\jamBox}}%
}%
}
\begin{document}
\begin{table}[hbt]
\centering
\caption{Elapsed Time (Seconds)}
\jamIfToBig{\textwidth}{%
\begin{tabular}{@{\vrule height 10.5pt depth4pt width0pt}llllllll}
& \multicolumn7c{Problem Size} \\
\cline{2-8}
Method & 2 & 10 & 90 & 250 & 900 & 2000 & 5000\\
\hline
Connoisseur & 0.5 & 3 & 21 & 49 & 120 & 323 & 600\\
Cowboy & 2 & 7 & 56 & 122 & 345 & 678 & 1545\\
Explorer & 0.5 & 2 & 19 & 45 & Crashed & Crashed & Crashed\\
Handyman & 6 & 31 & 258 & 600 & Crashed & Crashed & Crashed\\
\end{tabular}%
}
\label{tab:elapsed}
\end{table}
\begin{table}[hbt]
\centering
\huge
\caption{Wider table}
\jamIfToBig{\textwidth}{%
\begin{tabular}{@{\vrule height 10.5pt depth4pt width0pt}llllllll}
& \multicolumn7c{Problem Size} \\
\cline{2-8}
Method & 2 & 10 & 90 & 250 & 900 & 2000 & 5000\\
\hline
Connoisseur & 0.5 & 3 & 21 & 49 & 120 & 323 & 600\\
Cowboy & 2 & 7 & 56 & 122 & 345 & 678 & 1545\\
Explorer & 0.5 & 2 & 19 & 45 & Crashed & Crashed & Crashed\\
Handyman & 6 & 31 & 258 & 600 & Crashed & Crashed & Crashed\\
\end{tabular}%
}
\label{tab:elapsed}
\end{table}
\end{document}