LaTeX表格定位

168

我有一份LaTeX文档,其中包含一个段落后跟着4个表格,然后是第二个段落。我希望这4个表格出现在两段之间,根据我所阅读的,这意味着我应该在开始表格环境时使用[h]选项(例如\begin{table}[h])。

使用此选项后,前两个表格出现在第1段落后,但第2个段落随后显示,最后两个表格出现在下一页上。如何让表格出现在正确的位置?

我尝试了各种方法来修正位置,比如使用[h!],但似乎没有任何效果。在表格后面使用\clearpage可以使表格出现在第二段落之前,但它会留下大量空白的页面,而我希望第二段落紧接着表格开始。

Paragraph 1...

\begin{table}[h]
    table1...
\end{table}

\begin{table}[h]
   table2...
\end{table}[h]
...

Paragraph 2...

6
可选参数中所有字母的顺序都没有影响。 - Will Robertson
2
这只是略微相关的内容,但我认为了解它很重要:[h]选项不应单独使用,事实上,较新的LaTeX版本会自动将其替换为[ht]。这也可能是您遇到问题的原因。 您可以在17.2节“图形放置”中的此指南中阅读更多信息。 - vauhochzett
1
@Gacek [h!] 是正确的版本。它相当于 [H]。两者都需要 float 包。 - winklerrr
这个问题的TeX堆栈交流规范答案是:https://tex.stackexchange.com/q/39017/107497 - Teepeemm
9个回答

280

通过进一步搜索,我遇到了float宏包,可以防止LaTeX重新定位表格。

在导言部分:

\usepackage{float}

然后对于每个表格,你可以使用H定位选项(例如:\begin{table}[H])确保它不会被重新定位。


3
如果有人在使用org-mode,请将以下内容放在顶部:#+LATEX_HEADER: \restylefloat{table}``` 然后,使用以下代码添加表格: ```#+CAPTION: 表格标题 #+NAME: tab:table-label #+ATTR_LATEX: :placement [H] :center t <<实际表格内容>>请忽略注释中的格式问题。 - Gaurav
4
抱歉,但声称必须运行\restylefloat{table}才能使用[H]定位说明符的说法是错误的。仅当运行过包指令\floatstyle\floatplacement\floatname后,才应该运行\restylefloat{table}。请更新您的答案以删除有关\restylefloat的参考。如果您需要更多证明来表明经常运行\restylefloat不是一个好主意,请参阅Caption and label of a table, of two tables kept side by side, is assigned to another table帖子。 - Mico

64

表格定位

可用参数

可以使用以下参数轻松地放置表格:

  • h 将浮动对象放置在此处,即大约在源文本中出现的位置(但不是确切的位置)
  • t 定位于页面顶部
  • b 定位于页面底部
  • p 放置在仅供浮动对象使用的特殊页面上。
  • ! 覆盖LaTeX用于确定“良好”浮动位置的内部参数。
  • H 将浮动对象精确地放置在LATEX代码中的位置。需要float包。这与h!有些类似。

如果您想要使用 H(或 h!)进行精确定位,请确保在导言中正确设置了float包:

\usepackage{float}
\restylefloat{table}

示例

如果你想将表格放置在同一页上,可以使用参数ht,如下所示:

\begin{table}[ht]
    table content ...
\end{table}

Sources: Overleaf.com


2
对我来说,H 可以精确地放置表格在指定位置,但 h! 则不行。不确定在这种情况下 H 是否等同于 h! - Banty

39

在开始使用usepackage定义时,请包含以下内容:

\usepackage{placeins}

然后在前面和后面添加:

\FloatBarrier
\begin{table}[h]
    \begin{tabular}{llll}
      .... 
    \end{tabular}
\end{table}
\FloatBarrier

这会把表格放在文本中恰当的位置。


11

这里有一个简单的解决方案,来自Wikibooks:

placeins 包提供了命令 \FloatBarrier,可以用于防止浮动体移动到它上面。

我只需要在每个表格前后加上 \FloatBarrier 命令即可。


9
如果文本加表格再加文本无法放在一页上怎么办?试图这样强制排版很可能会导致页面过短,即因为表格默认不能跨页,所以它们会被推到下一页,在前一页留下空白。你会注意到,这在出版的书中从未出现过。
浮动行为是个好东西!我建议在文档完成之前,将[htbp]设为所有表格和图片的默认设置;只有在那之后,才考虑微调它们的精确位置。
附:阅读FAQ;这里提供的大多数其他答案都是那里给出建议的部分组合。

2
浮动行为可以避免留下空白,但将图表移开会使读者的阅读变得更加困难。因此,重要设计师Edward Tufte建议将文本和图表/表格整合在一起 - 在他出版的书籍中,他不按编号引用表格。不会出现“见表1”的情况,因为表格就在那里。他只是将它们放在正确的位置 - 在句子中间。我想这意味着需要做更多的工作来布置表格,但对读者来说却少了很多工作。 - Blaisorblade
@Blaisorblade - 当然,还有其他类似的显着例子,但我提议这样写文本对大多数人来说比使用浮点数难度要高一个数量级。你正在谈论放弃99%的书籍设计,以达到无法实现的最优解。请考虑我在回答中提出的观点:“如果表格不能放在文本下面怎么办?”在您的情况下必须重新设计或重写,而在许多情况下这是不可行的。 - Will Robertson
1
我们都认同最佳情况是什么,但实际上很难达到。在日常生活中,我通常使用浮点数。但我也会嵌入一些小表格和图形,效果还不错(前提是我检查了最终版本——这很容易,因为我的文档最多只有20页)。我认为浮动布局是一种合理的权衡而不是好事情 :-). - Blaisorblade
设置[htbp]和不设置有什么区别? - Waldir Leoncio
@WaldirLeoncio 至少对我来说,没有任何默认值是 [htbp] 而不是 [ht] - MrJonas

6
如果您想让两个表格并排显示,您可以使用以下代码:(需要加载float包)
\begin{table}[H]
 \begin{minipage}{.5\textwidth}
  %first table
 \end{minipage}
 \begin{minipage}{.5\textwidth}
  %second table
 \end{minipage}
\end{table}

每个图像都将有自己的标题和编号。 另一个选择是subfigure包。

6
在我的情况下,我遇到了这样一个问题:表格没有在我插入它的段落之后正确显示,所以我只需更改
\begin{table}[]

to

\begin{table}[ht]

4

您可能希望将以下内容添加到导言部分,并根据需要调整值:

 %------------begin Float Adjustment
%two column float page must be 90% full
\renewcommand\dblfloatpagefraction{.90}
%two column top float can cover up to 80% of page
\renewcommand\dbltopfraction{.80}
%float page must be 90% full
\renewcommand\floatpagefraction{.90}
%top float can cover up to 80% of page
\renewcommand\topfraction{.80}
%bottom float can cover up to 80% of page
\renewcommand\bottomfraction{.80}
%at least 10% of a normal page must contain text
\renewcommand\textfraction{.1}
%separation between floats and text
\setlength\dbltextfloatsep{9pt plus 5pt minus 3pt }
%separation between two column floats and text
\setlength\textfloatsep{4pt plus 2pt minus 1.5pt}

特别是,\floatpagefraction 可能会引起兴趣。


2

不必使用 \restylefloat,因为它会破坏其他选项,如标题位置。只需在 \begin{table} 后使用 [H][!h] 即可。


答案难以理解,请尽量提供更多细节。 - Visual Sharp
1
上面的答案说要使用\usepackage{float}和\restylefloat{table},但后者是不必要的,并会导致意外困难。只需要使用第一个就可以了。 - Michael McGrady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接