tabularx 中的自动列宽(以最小化空白空间)

tabularx 中的自动列宽(以最小化空白空间)

我有一个文本表(其中的文本通常很长,需要换行),并且每个单元格包含多个项目。但是,一行中每个单元格中的项目数量并不相同,尤其是在特定列中,这个数字通常较小。

我想要的是一种可以最小化整个表格空白空间的列类型。在这种情况下,通常包含较少项目的列会更窄。但不仅如此,其他列也应该根据单元格中的文本量来变宽或变窄。

这与“正常”列类型的行为类似,tabular但一个单元格中有多行。

请看一个例​​子来了解我的意思:

文本表的摘录,每个单元格包含多个项目,其中列的空白空间最少

这只是表格的摘录。请注意,第 2 列最宽,其次是第 1 列,然后是第 3 列,第 4 列最窄。我需要一种列类型,可以根据表格中所有单元格中的文本自动调整这些宽度。

下面是一个可以尝试的例子:

\documentclass[11pt, a4paper, oneside]{report}

\usepackage{lipsum}
\usepackage{tabularx}

\begin{document}

\begin{table}[!htb]
\centering
\caption{Caption.}
\label{label}
\small
\begin{tabularx}{\textwidth}{XXXX}
\hline
Header 1 & Header 2 & Header 3 & Header 4 \\ \hline
• \lipsum[23][1-2] \newline • \lipsum[23][1-3] \newline • \lipsum[23][1-2] & • \lipsum[23] & • \lipsum[3][1-2] \newline • \lipsum[2][1-3] \newline • \lipsum[1][1-2] & • Short and few \\ \hline
• \lipsum[4][1-2] \newline • \lipsum[4][1-3] \newline • \lipsum[4][1-2] & • \lipsum[4] & • \lipsum[3][1-2] \newline • \lipsum[2][1-3] \newline • \lipsum[1][1-2] & • Short and few \\ \hline
• \lipsum[5][1-2] \newline • \lipsum[5][1-3] \newline • \lipsum[5][1-2] & • \lipsum[5] & • \lipsum[2][1-2] \newline • \lipsum[1][1-3] \newline • \lipsum[2][1-2] & • Short and few \\
\hline
\end{tabularx}
\end{table}

\end(document)

答案1

一些评论和意见:

  • 我理解您的目标如下:让 LaTeX 自动确定环境X中 -type 列的相对宽度tabularx,以最小化环境的总高度(设置的宽度事前,对\textwidth吧?)。这个目标不仅雄心勃勃(这不是一件坏事本身(顺便说一下),但也可能导致印刷效果较差。为什么呢?

  • 如果给定列包含的内容很少,出于排版和美观的原因,其宽度通常不应小于某个固定值。例如,即使示例tabularx环境中的第 4 列几乎不包含任何内容,其最小可接受宽度也应不小于标题的宽度,此处为:“标题 4”。即使判断第四列标题单元格中的换行符是允许的,宽度也应不小于将 5 个和 6 个字母的单词单独放在一行上所需的宽度。(我的经验法则是,必须能够将不可拆分的单词“through”放在一行上,而不会溢出到下一列或右边距。)因此,一般来说,为了确定哪些列(如果有)应被赋予固定宽度,一些初步调整是不可避免的。

  • 如果tabularx环境具有n X不同(相对)宽度的 -type 列w_ii=1,...,n则只有n-1宽度是自由的,因为宽度还必须满足\sum_i w_i = n

  • 实际上,即使tabularx环境总共包含 4 或 5 列,如果为其中 1 或 2 列分配固定宽度,它们看起来可能最好。这也会将X-type 列的数量减少 1 或 2。例如,您的表格包含 4 列,但由于上述原因,1 列应该被分配固定宽度事前注意事项。这样就只剩下 3 个类型X列,因此只有 2 个自由参数。我可以轻率地断言,即使将设置为起点,大多数人也可以在 2 或 3 次迭代内轻松找到w_1w_2和的满意值。w_3w_1=w_2=w_3=1

对于手头上的例子,我仅通过 2 次迭代就得到了w_1=0.6w_2=1.3w_3=1.1,这仅仅是通过应用基本的“视觉回归”分析。幸运的是,表格适合文本块(假设四周的边距为 2.5 厘米)。对 、 和 进行一些额外的调整w_1几乎w_2肯定w_3会使外观更加紧凑。但是,我认为这样的努力完全是浪费,因为表格本身就很大,很可能它会单独存在于页面上。

在此处输入图片描述


\documentclass[11pt, a4paper, oneside]{report}

\usepackage[margin=2.5cm]{geometry} % set suitable page size parameters
\usepackage{lipsum}

\usepackage{tabularx,ragged2e,booktabs,caption}
\newcolumntype{P}[1]{>{\RaggedRight\hspace{0pt}}p{#1}}
\newcolumntype{L}[1]{>{\RaggedRight\hsize=#1\hsize\linewidth=\hsize}X}

\newlength\mylength

\usepackage{enumitem}
% create a bespoke itemize-like environment:
\newlist{myitemize}{itemize}{1}
\setlist[myitemize]{label =\textbullet, nosep, wide=0pt,
                    before=\begin{minipage}[t]{\hsize},
                    after =\end{minipage}}

\begin{document}

\begin{table}[htbp]
\small
\captionsetup{size=small,skip=0.333\baselineskip}
\caption{Caption.}\label{label}
% measure width of col. 4:
\settowidth\mylength{Header 4} 
\setlength\tabcolsep{4pt}
\begin{tabularx}{\textwidth}{@{} L{0.6}L{1.3}L{1.1} P{\mylength} @{}}
\toprule
Header 1 & Header 2 & Header 3 & Header 4 \\
\midrule
\begin{myitemize}
\item \lipsum[23][1-2] 
\item \lipsum[23][1-3]
\item \lipsum[23][1-2] 
\end{myitemize} &
\begin{myitemize}
\item \lipsum[23]
\end{myitemize} &
\begin{myitemize}
\item \lipsum[3][1-2] 
\item \lipsum[2][1-3] 
\item \lipsum[1][1-2]
\end{myitemize} &
\begin{myitemize}
\item Short and few 
\end{myitemize}\\
\midrule

\begin{myitemize}
\item \lipsum[4][1-2] 
\item \lipsum[4][1-3] 
\item \lipsum[4][1-2]
\end{myitemize} &
\begin{myitemize}
\item \lipsum[4]
\end{myitemize} &
\begin{myitemize}
\item \lipsum[3][1-2] 
\item \lipsum[2][1-3] 
\item \lipsum[1][1-2]
\end{myitemize} &
\begin{myitemize}
\item Short and few
\end{myitemize} \\
\midrule

\begin{myitemize}
\item \lipsum[5][1-2] 
\item \lipsum[5][1-3] 
\item \lipsum[5][1-2]
\end{myitemize} &
\begin{myitemize}
\item \lipsum[5]
\end{myitemize} &
\begin{myitemize}
\item \lipsum[2][1-2]
\item \lipsum[1][1-3]
\item \lipsum[2][1-2]
\end{myitemize} &
\begin{myitemize}
\item Short and few 
\end{myitemize} \\
\bottomrule
\end{tabularx}
\end{table}

\end{document}

相关内容