Pozycjonowanie stołu LaTeX

101

Mam dokument LaTeX, który zawiera akapit, po którym następują 4 tabele, po których następuje drugi akapit. Chcę, aby między dwoma akapitami pojawiły się 4 tabele, co z tego, co przeczytałem, oznacza, że ​​powinienem użyć opcji [h] po uruchomieniu środowiska tabelowego (np \begin{table}[h].).

Korzystając z tego, pierwsze dwie tabele pojawiają się po akapicie 1, zgodnie z oczekiwaniami, jednak akapit 2 jest następnie wyświetlany, a dwie ostatnie tabele pojawiają się na następnej stronie. Jak sprawić, by tabele pojawiały się we właściwej lokalizacji?

Próbowałem różnych rzeczy, aby poprawić pozycjonowanie, na przykład używając, [h!]ale nie wydaje się to mieć żadnego efektu. Używanie \clearpagepo tabelach daje pożądany efekt w postaci pojawienia się tabel przed drugim akapitem, ale następnie pozostawia ostatnie dwie tabele na własnej stronie z dużą ilością spacji, podczas gdy wolałbym, aby drugi akapit zaczynał się natychmiast stoły.

Paragraph 1...

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

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

Paragraph 2...
Jared Russell
źródło
Ja też tego spróbowałem i nie dało to żadnego efektu.
Jared Russell
6
Kolejność (wszystkich) liter w opcjonalnym argumencie nie ma znaczenia.
Will Robertson
@Gacek, założę się, że Will Robertson ma rację. Według mintaka.sdsu.edu/GF/bibliog/latex/floats.html , „argumenty w nawiasach mówią LaTeX, gdzie można umieścić zmiennoprzecinkowy; ich kolejność nie ma znaczenia”.
Waldir Leoncio
Jest to tylko nieznacznie powiązane, ale uważam, że ważne jest, aby wiedzieć: Opcja [h] nigdy nie powinna być używana samodzielnie, aw rzeczywistości nowsze wersje LaTeX-a zastępują ją automatycznie [ht]. To mógł być również twój problem. Więcej informacji można znaleźć w tym przewodniku w sekcji 17.2 „Rozmieszczenie figur”.
vauhochzett
@Gacek [h!]to poprawna wersja. To odpowiednik [H]. Oba wymagają floatpakietu.
winklerrr

Odpowiedzi:

174

Po kilku kolejnych googlach natknąłem się na pakiet float , który pozwala zapobiec repozycjonowaniu tabel przez LaTeX.

W preambule:

\usepackage{float}
\restylefloat{table}

Następnie dla każdego stołu możesz użyć Hopcji umieszczania (np. \begin{table}[H]), Aby upewnić się, że nie zostanie zmieniona.

Jared Russell
źródło
23
Być może warto podkreślić, że należy używać litery „H”, a nie „h”. To właśnie zauważyłem na własne oczy.
bikashg
@bikashg Hjest odpowiednikiem h!(aby uzyskać więcej informacji o parametrach, sprawdź moją odpowiedź tutaj )
winklerrr
1
W przypadku, gdy ktoś używa trybu org, umieść to na górze: #+LATEX_HEADER: \usepackage{float} #+LATEX_HEADER: \restylefloat{table} A potem, #+CAPTION: A table #+NAME: tab:table-label #+ATTR_LATEX: :placement [H] :center t <<actual table content>> wybacz słabe formatowanie nowej linii w komentarzach.
Gaurav,
Przepraszamy, ale twierdzenie, że konieczne jest uruchomienie \restylefloat{table}, aby użyć specyfikatora [H]pozycjonowania, jest fałszywe . Trzeba tylko kiedykolwiek uruchamiane \restylefloat{table}jeśli najpierw uruchomić pakiet instrukcji \floatstyle, \floatplacementlub \floatname. Zaktualizuj swoją odpowiedź, aby usunąć odniesienie do \restylefloat. Jeśli potrzebujesz więcej dowodów na to, że \restylefloatrutynowe uruchamianie nie jest dobrym pomysłem, zobacz opis i etykieta ogłaszania tabeli, dwóch tabel umieszczonych obok siebie, jest przypisanych do innej tabeli .
Mico
25

To zadziałało dla mnie:

Na początku usepackagedefinicje obejmują:

\usepackage{placeins}

A przed i po dodaniu:

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

Spowoduje to umieszczenie tabeli dokładnie tam, gdzie chcesz w tekście.

Don Giulio
źródło
To naprawdę bardzo przydatny pakiet. Dzięki za udostępnienie!
John David
15

Pozycjonowanie stołu

Dostępne parametry

W łatwy sposób można ustawić stół o następujących parametrach:

  • hUmieść pływak tutaj , tj. Mniej więcej w tym samym miejscu, w którym występuje w tekście źródłowym (jednak nie dokładnie w tym miejscu)
  • tPozycja u góry strony.
  • bPozycja na dole strony.
  • pUmieść na specjalnej stronie tylko dla pływaków.
  • ! Zastąp parametry wewnętrzne, których LaTeX używa do określania „dobrych” pozycji zmiennoprzecinkowych.
  • HUmieszcza zmiennoprzecinkową dokładnie w miejscu w kodzie LATEX. Wymaga pakietu float. Jest to w pewnym stopniu równoważne z h!.

Jeśli chcesz wykorzystać H(lub h!) do dokładnego pozycjonowania, upewnij się, że floatpakiet został poprawnie skonfigurowany w preambule:

\usepackage{float}
\restylefloat{table}

Przykład

Jeśli chcesz umieścić tabelę na tej samej stronie, w dokładnym miejscu lub przynajmniej na górze strony (co najlepiej pasuje do silnika lateksowego), użyj parametrów hi ttak:

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

Źródła: Overleaf.com

winklerrr
źródło
7

Co się stanie, jeśli tekst, tabele i tekst nie mieszczą się na jednej stronie? Próbując wymusić skład w ten sposób, bardzo prawdopodobne jest, że strony będą zbyt krótkie; tj. ponieważ tabela nie może domyślnie przełamać strony, zostanie przesunięta na następną i pozostawi lukę na stronie wcześniej. Zauważysz, że nigdy nie zobaczysz tego w opublikowanej książce.

Pływanie to Dobra Rzecz! Zalecam używanie [htbp]jako ustawienia domyślnego dla wszystkich tabel i rysunków do czasu ukończenia dokumentu; dopiero wtedy powinni pomyśleć o precyzyjnym dostrojeniu ich dokładnego rozmieszczenia.

PS Przeczytaj FAQ ; większość innych odpowiedzi tutaj to częściowe kombinacje udzielonych tam porad.

Will Robertson
źródło
1
Unoszenie się pozwala uniknąć opuszczania przestrzeni, ale oddalanie się postaci utrudnia życie czytelnikowi. Z tego powodu Edward Tufte, ważny projektant, zaleca integrację tekstu i rycin / tabel - w swoich publikowanych książkach nie odwołuje się do numerów po numerach. „Zobacz tabelę 1” nie pojawia się, ponieważ tabela właśnie tam jest. Po prostu umieszcza je we właściwym miejscu - w połowie zdania. Myślę, że oznacza to więcej pracy przy rozplanowaniu tabel, ale mniej pracy dla czytelników.
Blaisorblade
@Blaisorblade - jasne, a są inne takie godne uwagi przykłady, ale proponuję, że napisanie tekstu w taki sposób jest dla większości ludzi o rząd wielkości trudniejsze niż używanie pływaków. Mówisz o odrzuceniu 99% projektu książki dla nieosiągalnego optimum. Rozważ kwestię, którą poczyniłem w mojej odpowiedzi: „a co, jeśli tabela nie mieści się pod tekstem?” W twoim scenariuszu trzeba przeprojektować lub przepisać, a to jest nie do utrzymania w wielu sytuacjach.
Will Robertson
1
Cóż, zgadzamy się co do tego, jakie jest optymalne - i tak, najczęściej jest to praktycznie nieosiągalne. W życiu codziennym też zazwyczaj trzymam się pływaków. Ale mam małe tabelki i ryciny w wierszu i działa całkiem nieźle (pod warunkiem, że sprawdzę ostateczną wersję - co jest łatwe tylko dlatego, że mam dokumenty o maksymalnej długości 20 stron). Po prostu postrzegam unoszenie się jako rozsądny kompromis, a nie dobrą rzecz :-).
Blaisorblade
Jaka jest różnica między ustawieniem [htbp]a niczym?
Waldir Leoncio
@WaldirLeoncio przynajmniej dla mnie, w ogóle nic do domyślnych [ht]zamiast[htbp]
MrJonas
7

Oto proste rozwiązanie z Wikibooks :

Pakiet placeins zawiera polecenie \ FloatBarrier, którego można użyć, aby zapobiec przesuwaniu się po nim elementów pływających.

Po prostu stawiam \FloatBarrierprzed i po każdym stole.

Jason Bertels
źródło
4

Jeśli chcesz mieć dwie tabele obok siebie, możesz użyć: (z floatzaładowanym pakietem)

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

Każdy będzie miał własny podpis i numer. Inną opcją jest subfigurepakiet.

Crowley
źródło
3

Możesz dodać to do swojej preambuły i dostosować wartości w razie potrzeby:

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

W szczególności interesujący może być \ floatpagefraction.

Mika
źródło
0

Aby umieścić podpisy nad ruchomymi tabelami umieszczonymi w pozycji [H], wstaw w preambule następujący tekst:

\usepackage{float}
\floatstyle{plaintop}
\restylefloat{table}
CW
źródło