Posicionamento de mesa LaTeX

98

Eu tenho um documento LaTeX que contém um parágrafo seguido por 4 tabelas seguidas por um segundo parágrafo. Quero que as 4 tabelas apareçam entre os dois parágrafos, o que, pelo que li, significa que devo usar a opção [h] após iniciar o ambiente da tabela (por exemplo \begin{table}[h]).

Usando isso, as duas primeiras tabelas aparecem após o parágrafo 1 conforme o esperado; no entanto, o parágrafo 2 é exibido com as duas últimas tabelas aparecendo na página seguinte. Como faço para que as tabelas apareçam no local correto?

Tentei várias coisas para corrigir o posicionamento, como usar, [h!]mas isso não parece ter surtido efeito. Usar \clearpagedepois das tabelas tem o efeito desejado de fazer as tabelas aparecerem antes do segundo parágrafo, mas depois deixa as duas últimas tabelas em suas próprias páginas com muito espaço em branco, quando eu preferiria que o segundo parágrafo começasse imediatamente após o tabelas.

Paragraph 1...

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

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

Paragraph 2...
Jared Russell
fonte
Eu tentei isso também e não teve nenhum efeito.
Jared Russell
6
A ordem de (todas) as letras no argumento opcional não tem efeito.
Will Robertson
@Gacek, aposto que Will Robertson está certo. De acordo com mintaka.sdsu.edu/GF/bibliog/latex/floats.html , "[os] argumentos entre colchetes dizem ao LaTeX onde é possível colocar o float; sua ordem não é importante."
Waldir Leoncio
Isso está apenas ligeiramente relacionado, mas acho que é importante saber: a opção [h] nunca deve ser usada sozinha e, de fato, as versões mais recentes do LaTeX a substituem por [ht] automaticamente. Esse também pode ter sido o seu problema. Você pode ler mais neste guia na seção 17.2 "Colocação da Figura".
vauhochzett
@Gacek [h!]é a versão correta. É o equivalente a [H]. Ambos requerem o floatpacote.
winklerrr

Respostas:

171

Depois de fazer mais pesquisas no Google, me deparei com o pacote float que permite evitar que o LaTeX reposicione as tabelas.

No preâmbulo:

\usepackage{float}
\restylefloat{table}

Então, para cada mesa, você pode usar a Hopção de posicionamento (por exemplo \begin{table}[H]) para garantir que não seja reposicionada.

Jared Russell
fonte
22
Talvez valha a pena enfatizar que deve ser usado "H" e não "h". Isso é o que observei por mim mesmo.
bikashg
@bikashg Hé equivalente a h!(para mais informações sobre parâmetros, verifique minha resposta aqui )
winklerrr
1
Caso alguém esteja usando o modo org, coloque isto no topo: #+LATEX_HEADER: \usepackage{float} #+LATEX_HEADER: \restylefloat{table} E então, #+CAPTION: A table #+NAME: tab:table-label #+ATTR_LATEX: :placement [H] :center t <<actual table content>> desculpe a má formatação de nova linha nos comentários.
Gaurav
23

Isso funcionou para mim:

No início, as usepackagedefinições incluem:

\usepackage{placeins}

E antes e depois de adicionar:

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

Isso coloca a tabela exatamente onde você deseja no texto.

Don Giulio
fonte
Este é um pacote realmente muito útil. Obrigado por compartilhar!
John David
11

Posicionamento da mesa

Parâmetros Disponíveis

Uma mesa pode ser facilmente colocada com os seguintes parâmetros:

  • hColoque o flutuador aqui , ou seja, aproximadamente no mesmo ponto em que ocorre no texto de origem (no entanto, não exatamente no local)
  • tPosicione no topo da página.
  • bPosicione na parte inferior da página.
  • pColoque em uma página especial apenas para carros alegóricos.
  • ! Substitua os parâmetros internos que o LaTeX usa para determinar as "boas" posições de flutuação.
  • HColoca o flutuador precisamente no local do código LATEX. Requer o pacote float. Isso é um pouco equivalente a h!.

Se você quiser fazer uso de H(ou h!) para um posicionamento exato, certifique-se de ter o floatpacote configurado corretamente no preâmbulo:

\usepackage{float}
\restylefloat{table}

Exemplo

Se você deseja colocar a tabela na mesma página, seja no local exato ou pelo menos no topo da página (o que se encaixa melhor no mecanismo de látex), use os parâmetros he tassim:

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

Fontes: Overleaf.com

Winklerrr
fonte
7

O que acontece se o texto mais tabelas mais texto não couberem em uma única página? Ao tentar forçar a composição dessa forma, é muito provável que você termine com páginas muito curtas; ou seja, como uma tabela não pode quebrar por padrão em uma página, ela será enviada para a próxima e deixará uma lacuna na página anterior. Você perceberá que nunca verá isso em um livro publicado.

O comportamento flutuante é uma coisa boa! Eu recomendo usar [htbp]como configuração padrão para todas as tabelas e figuras até que o documento esteja completo; só então deve pensar em ajustar seu posicionamento preciso.

PS Leia o FAQ ; a maioria das outras respostas aqui são combinações parciais de conselhos dados lá.

Will Robertson
fonte
1
O comportamento flutuante evita deixar espaço, mas mover as figuras torna a vida mais difícil para o leitor. Por esta razão Edward Tufte, um importante designer, recomenda a integração de texto e figuras / tabelas - em seus livros publicados, ele não se refere a tabelas por número. "Ver Tabela 1" não aparece, pois a tabela está apenas lá. Ele apenas os coloca no lugar certo - no meio da frase. Acho que isso significa trabalhar mais para organizar as tabelas, mas menos para os leitores.
Blaisorblade
@Blaisorblade - claro, e existem outros exemplos notáveis, mas eu proponho que escrever um texto dessa forma é uma ordem de magnitude mais difícil para a maioria das pessoas do que usar flutuadores. Você está falando sobre descartar 99% do design do livro por um ótimo inatingível. Considere o que eu disse em minha resposta: 'e se uma tabela não couber abaixo do texto?' Em seu cenário tem que redesenhar ou reescrever, e isso é insustentável em muitas situações.
Will Robertson
1
Bem, nós concordamos em qual é o ideal - e sim, na maioria das vezes é praticamente inatingível. Na vida cotidiana, também costumo me limitar aos carros alegóricos. Mas tenho pequenas tabelas e figuras embutidas, e funciona muito bem (desde que eu verifique a versão final - o que é fácil apenas porque tenho documentos de no máximo 20 páginas). Eu apenas vejo a flutuação como uma troca razoável em vez de uma coisa boa :-).
Blaisorblade
Qual é a diferença entre definir [htbp]em oposição a nada?
Waldir Leoncio
@WaldirLeoncio pelo menos para mim, nada é padronizado para um [ht]ao invés de[htbp]
MrJonas
7

Aqui está uma solução fácil, do Wikibooks :

O pacote placeins fornece o comando \ FloatBarrier, que pode ser usado para evitar que flutuadores sejam movidos sobre ele.

Acabei de colocar \FloatBarrierantes e depois de cada mesa.

Jason Bertels
fonte
4

Se você deseja ter duas tabelas próximas uma da outra, você pode usar: (com floatpacote carregado)

\begin{table}[H]
 \begin{minipage}{.5\textwidth}
  %first table
 \end{minipage}
 \begin{minipage}{.5\textwidth}
  %second table
 \end{minipage}
\end{table}

Cada um terá sua própria legenda e número. Outra opção é o subfigurepacote.

Crowley
fonte
3

Você pode adicionar isso ao seu preâmbulo e ajustar os valores conforme necessário:

 %------------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}

Particularmente, a \ floatpagefraction pode ser de interesse.

Mica
fonte