有些表格的垂直空間較寬(那些導致 \hboxes 過滿的?)

有些表格的垂直空間較寬(那些導致 \hboxes 過滿的?)

使用以下程式碼:

\documentclass[a4paper]{report}
\usepackage{lipsum}

\begin{document}
a
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
Ord & Esplicito (Adam-Bashforth) & Implicito (Adam-Moulton) \\\hline
0 & & $y_{n+1}=y_n+hf_{n+1}$ Eulero implicito \\\hline
1 & $y_{n+1}=y_n+hf_n$, Eulero esplicito & $y_{n+1}=y_n+\frac{h}{2}(f_{n+1}+f_n)$ Greg-Nickolson \\\hline
2 & $y_{n+1}=y_n+\frac{h}{2}(2f_n-f_{n-1})$ & $y_{n+1}=y_n+\frac{h}{12}(5f_{n+1}+8f_n-f_{n-1})$ \\\hline
3 & $y_{n+1}=y_n+\frac{h}{12}(23f_n-16f_{n-1}+5f_{n-2})$ & \\\hline
\end{tabular}
\end{center}
\lipsum[1]
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
Ord & Esplicito (Adam-Bashforth) & Implicito (Adam-Moulton) \\\hline
0 & & $y_{n+1}=y_n+hf_{n+1}$ Eulero implicito \\\hline
2 & $y_{n+1}=y_n+\frac{h}{2}(2f_n-f_{n-1})$ & $y_{n+1}=y_n+\frac{h}{12}(5f_{n+1}+8f_n-f_{n-1})$ \\\hline
3 & $y_{n+1}=y_n+\frac{h}{12}(23f_n-16f_{n-1}+5f_{n-2})$ & \\\hline
\end{tabular}
\end{center}
b
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
Ord & Esplicito (Adam-Bashforth) & Implicito (Adam-Moulton) \\\hline
0 & & $y_{n+1}=y_n+hf_{n+1}$ Eulero implicito \\\hline
2 & $y_{n+1}=y_n+\frac{h}{2}(2f_n-f_{n-1})$ & $y_{n+1}=y_n+\frac{h}{12}(5f_{n+1}+8f_n-f_{n-1})$ \\\hline
\end{tabular}
\end{center}
c
\end{document}

我得到:

在此輸入影像描述

這些例子讓我懷疑更大的垂直空間,這讓我煩惱,是由於\hbox具有更大垂直空間的表格(在表格上方的文字和表格之間)產生的溢出。為什麼會發生這種情況?我的懷疑正確嗎?

答案1

該空間顯然是由桌子過滿造成的,了解原因可能會很有成效。您看到的多餘垂直空間是一條空線。

當您\\在內部執行操作時center,您將關閉一個段落,因此只需透過以下方式即可重現效果

\documentclass{article}
\begin{document}
a
\begin{center}\tracingparagraphs=1
\vrule height 1pt depth 0pt width 1.2\textwidth % an overlong indivisible object
\end{center}
b
\end{document}

\tracingparagraph=1將使 TeX 在.log文件中報告其計算結果,即

@firstpass
[]
@\penalty via @@0 b=0 p=0 d=100
@@1: line 1.2 t=100 -> @@0
@secondpass
[]
@\penalty via @@0 b=0 p=0 d=100
@@1: line 1.2 t=100 -> @@0
|
@\par via @@1 b=* p=-10000 d=*
@@2: line 2.3- t=100 -> @@1

第一次通過該段落,僅由 代表的框組成,|顯然沒有成功。此[]位元表示縮排框(0pt 寬)。

第二遍顯示在段落開頭的可行中斷(@@0,始終存在,因為新段落從新行開始),然後是懲罰(由\item隱式插入的命令插入\begin{center})。此懲罰提供了一個行斷點,然後使用該斷點,因為它允許排版非過滿的行。然而,過長的規則導致 TeX 認輸。

一個非常不同的情況是\centering使用 just 時:

\documentclass{article}
\begin{document}
a
\begingroup\centering \tracingparagraphs=1
\vrule height 1pt depth 0pt width 1.2\textwidth
\par\endgroup
b
\end{document}

報告

@firstpass
[]\OT1/cmr/m/n/10 a 
@ via @@0 b=0 p=0 d=100
@@1: line 1.2 t=100 -> @@0
@secondpass
[]\OT1/cmr/m/n/10 a 
@ via @@0 b=0 p=0 d=100
@@1: line 1.2 t=100 -> @@0
|
@\par via @@1 b=* p=-10000 d=*
@@2: line 2.3- t=100 -> @@1

這裡段落中沒有加入懲罰,所以唯一可行的破發點是在最後。沒有增加“垂直空間”(實際上是空白行)。

然而,一開始就不應該寫得太滿,所以討論只是學術性的。

答案2

我猜想問題確實出在center環境上,環境是基於trivlist開放的\item。當項目中的第一個「字母」太寬而無法容納在行中時,TeX 會插入換行符。建議的解決方案:

\newenvironment{senter}{\par\centering\medskip}{\par\medskip}

然後使用senter代替center.如果需要,可將 s變更\medskip為更大或更小的值。

相關內容