仅当表格大于列宽时才调整其大小或缩放表格

仅当表格大于列宽时才调整其大小或缩放表格

我在文档中有一个表格,但我不确定最终的字体大小是多少。字体大小可能是 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}

相关内容