这可能是在问很多但我希望有一种方法可以按相同的比例自动缩放具有相似内容的多个表格,以使最宽的表格适合特定的宽度(例如,文本宽度),而无需手动管理比例因子。
举个例子:
\documentclass[12pt]{article}
\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{showframe}
\begin{document}
\newlength{\cell}
\setlength{\cell}{3cm}
\begin{table}
\caption{Wide}
\resizebox{\textwidth}{!}{
\begin{tabular}{lll}
\toprule
\textbf{Column 1} & \textbf{Column 2} & \textbf{Column 3} \\
\midrule
\rule{\cell}{1ex} & \rule{\cell}{1ex} & \rule{\cell}{1ex} \\
\rule{\cell}{1ex} & \rule{\cell}{1ex} & \rule{\cell}{1ex} \\
\bottomrule
\end{tabular}
}
\end{table}
\setlength{\cell}{4cm}
\begin{table}
\caption{Wider}
\resizebox{\textwidth}{!}{
\begin{tabular}{lll}
\toprule
\textbf{Column 1} & \textbf{Column 2} & \textbf{Column 3} \\
\midrule
\rule{\cell}{1ex} & \rule{\cell}{1ex} & \rule{\cell}{1ex} \\
\rule{\cell}{1ex} & \rule{\cell}{1ex} & \rule{\cell}{1ex} \\
\bottomrule
\end{tabular}
}
\end{table}
\setlength{\cell}{5cm}
\begin{table}
\caption{Widest}
\resizebox{\textwidth}{!}{
\begin{tabular}{lll}
\toprule
\textbf{Column 1} & \textbf{Column 2} & \textbf{Column 3} \\
\midrule
\rule{\cell}{1ex} & \rule{\cell}{1ex} & \rule{\cell}{1ex} \\
\rule{\cell}{1ex} & \rule{\cell}{1ex} & \rule{\cell}{1ex} \\
\bottomrule
\end{tabular}
}
\end{table}
\end{document}
所有表格都适合\textwidth
使用resizebox
。但我想按相同的比例自动缩放所有表格,以使最宽的表格适合\textwidth
。目标是使所有表格都适合页面,同时也具有一致的外观(就字体大小等而言)。
答案1
请,请,别这么做。拜托 :-)
如果表格太大,则应更改字体大小或重新排列表格以使其适合。即使你按相同的量缩放所有表格,你所能得到的最好结果也不过是一致的不一致。
但是,如果您坚持这样做,这里有一个\ScaleorResize
命令,它接受两个参数:#1
,最宽物体的宽度和#2
,一个物体。该命令排版该物体并从中窃取其比例因子\resizebox
(伪装成\scalebox
)。然后,该命令检查被盗的比例因子与已知的最大比例因子,方便地称为\PleaseDontSF
(SF
代表比例因子:-)。如果该比例因子较大,则\PleaseDontSF
更新并排版该物体。否则,该物体将重新缩放为\PleaseDontSF
。由于最宽的物体可能发生在文档末尾,因此\PleaseDontSF
将保存到.aux
文件中以在下次 LaTeX 运行中更新,因此您至少需要运行两次才能确保缩放正确而错误。
就是这样。将\makeatletter
和\makeatother
中的所有内容放入文档中,然后全部替换\resizebox{<something>}{!}
为\ScaleorResize{<something>}
。为简洁起见,我将表格放在命令中,但在文档中您不需要这样做:
\documentclass[12pt]{article}
\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{showframe}
\makeatletter
\edef\scalefactor{\strip@pt\maxdimen}
\edef\PleaseDontSF{\strip@pt\maxdimen}
\edef\PleaseDontCHK{\strip@pt\maxdimen}
\let\graphicx@Gscale@box\Gscale@box
\long\def\Gscale@box#1{%
\xdef\scalefactor{#1}%
\graphicx@Gscale@box{#1}}
\AtEndDocument{%
\immediate\write\@auxout
{\gdef\noexpand\PleaseDontSF{\PleaseDontCHK}}}%
\newsavebox\@weirdbox@a
\newsavebox\@weirdbox@b
\protected\long\def\ScaleorResize#1#2{%
\sbox\@weirdbox@a{#2}%
\sbox\@weirdbox@b{\resizebox{#1}{!}{\usebox\@weirdbox@a}}%
\ifdim\scalefactor\p@<\PleaseDontCHK\p@
\xdef\PleaseDontCHK{\scalefactor}%
\fi
\ifdim\scalefactor\p@<\PleaseDontSF\p@
\xdef\PleaseDontSF{\scalefactor}%
\usebox\@weirdbox@b
\else
\scalebox{\PleaseDontSF}{\usebox\@weirdbox@a}%
\fi}
\makeatother
\def\weirdtable#1{%
\begin{tabular}{lll}
\toprule
\textbf{Column 1} & \textbf{Column 2} & \textbf{Column 3} \\
\midrule
\rule{#1}{1ex} & \rule{#1}{1ex} & \rule{#1}{1ex} \\
\rule{#1}{1ex} & \rule{#1}{1ex} & \rule{#1}{1ex} \\
\bottomrule
\end{tabular}}
\begin{document}
\begin{table}
\caption{Wide}
\centering
\ScaleorResize{\textwidth}{\weirdtable{3cm}}
\end{table}
\begin{table}
\caption{Wider}
\centering
\ScaleorResize{\textwidth}{\weirdtable{4cm}}
\end{table}
\begin{table}
\caption{Widest}
\centering
\ScaleorResize{\textwidth}{\weirdtable{5cm}}
\end{table}
\end{document}
请看: