LaTeX/浮動體、圖形和標題
之前的章節介紹了匯入圖形。 然而,僅僅將一張圖片貼上在段落之間看起來並不專業。 首先,我們需要一種新增標題的方法,並能夠進行交叉引用。 我們需要一種定義圖形的方法。 如果 LaTeX 可以應用類似於它排列文字以使其看起來最好的原理來排列圖片,那就太好了。 這就是浮動體發揮作用的地方。
浮動體是文件中無法在頁面上斷開的物件的容器。 LaTeX 預設情況下識別“表格”和“圖形”浮動體,但您可以定義自己的新浮動體(參見下面的自定義浮動體)。 浮動體用於解決無法放在當前頁面上的物件問題,以及在您確實不想現在就將物件放在這裡的情況下的幫助。
浮動體不是正常文字流的一部分,而是獨立的實體,放置在頁面上的一個獨立區域(頂部、中間、底部、左邊、右邊或設計者指定的位置)。 它們始終帶有描述它們的標題,並且始終編號,以便可以從文字中的其他地方引用它們。 LaTeX 會自動浮動表格和圖形,具體取決於在處理它們時頁面上剩餘的空間量。 如果當前頁面上沒有足夠的空間,則浮動體將移動到下一頁的頂部。 可以透過將表格或圖形定義移動到文字中的更早或更晚的位置,或調整控制自動浮動的某些引數來更改此行為。
作者有時會在緊密相鄰的文字中放置許多浮動體,這會導致一個問題,即它們應該如何放在頁面上,並且仍然為文字留出空間。 在這種情況下,LaTeX 會將它們全部堆疊在一起,並儘可能地將它們一起列印,或者在抗議中將它們留到章節的末尾。 訣竅是在文字中將它們間隔開,這樣它們既不會干擾您的論點或討論的思路,也不會影響排版頁面的視覺平衡。
與其他各種實體一樣,在行中未處理(放置)的浮動體數量存在限制。 LaTeX 預設情況下可以處理最多 18 個浮動體,一個典型的錯誤是
! LaTeX Error: Too many unprocessed floats.
morefloats 包會解除此限制。
要建立浮動圖形,請使用figure 環境。
\begin{figure}[placement specifier]
... figure contents ...
\end{figure}
|
上一節提到了如何使用浮動體讓 LaTeX 在保持最佳演示效果的同時處理圖形。 但是,有時您可能不同意,而一個典型的例子是它對圖形定位。 位置說明符引數作為一種折衷方案存在,它的目的是讓作者能夠更好地控制某些浮動體放置的位置。
| 說明符 | 許可權 |
|---|---|
h
|
將浮動體放在這裡,即大約在源文字中出現的位置(但是,不是完全在該位置) |
t
|
放置在頁面頂部。 |
b
|
放置在頁面底部。 |
p
|
放在專門用於浮動體的頁面上。 |
!
|
覆蓋 LaTeX 用於確定“良好”浮動體位置的內部引數。 |
H
|
將浮動體精確地放置在 LaTeX 程式碼中的位置。 需要float 包,[1] 例如,\usepackage{float}。 |
您對這些位置許可權所做的事情是列出您希望提供給 LaTeX 的選項。 這些只是可能性,LaTeX 在排版您的文件時會決定它認為哪一個最適合您提供的說明符。 Frank Mittelbach 描述了該演算法[2]
- 如果遇到浮動體,LaTeX 會嘗試根據其規則(稍後詳細介紹)立即將其放置
- 如果成功,則浮動體將被放置,並且該決定永遠不會改變;
- 如果失敗,則 LaTeX 會將浮動體放入一個儲存佇列中,以便在開始下一頁時重新考慮(但不會更早)。
- 頁面完成之後,LaTeX 會檢查這個儲存佇列,並儘可能地將其清空。 為此,它首先會嘗試生成儘可能多的浮動體頁面(希望能夠從佇列中刪除浮動體)。 一旦此可能性耗盡,它接下來會嘗試將剩餘的浮動體放置在頂部和底部區域。 它會檢視所有剩餘的浮動體,並將其放置或推遲到下一頁(即,再次將它們新增到儲存佇列中)。
- 之後,它會開始處理此頁面的文件內容。 在此過程中,它可能會遇到更多浮動體。
- 如果文件結尾已到達,或者遇到 \clearpage,LaTeX 會開始一個新頁面,放寬所有限制性浮動體條件,並透過將它們放在浮動體頁面上輸出儲存佇列中的所有浮動體。
在某些特殊情況下,LaTeX 不會遵循這些定位引數,並且需要額外的命令,例如,如果需要為單獨位於一個頁面上的浮動體指定除居中以外的對齊方式[3]。
使用\listoffigures 在文件開頭新增圖形列表。 要將標題中使用的名稱從圖形更改為示例,請在圖形內容中使用\renewcommand{\figurename}{示例}。 有關此內容的更多資訊,請參見新建命令部分。
可以在所有圖形周圍新增一個細邊框。你只需要在文件開頭寫一次以下程式碼
\usepackage{float}
\floatstyle{boxed}
\restylefloat{figure}
|
邊框不包括標題。
浮動表格在另一章中進行了介紹。在這裡我們快速提醒一下。預設情況下,用於構造表格的tabular環境不是浮動環境。因此,對於你想讓其浮動的表格,將tabular環境包裹在table環境中,如下所示
\begin{table}
\begin{tabular}{...}
... table data ...
\end{tabular}
\end{table}
|
你可能會覺得這種方法有些繁瑣,但這種區別是必要的,因為你可能不希望所有表格都被視為浮動環境。
使用\listoftables在文件開頭新增一個表格列表。
placeins[1] 包提供了命令\FloatBarrier,它可以用於防止浮動元素被移動到它之上。例如,這在每個部分的開頭很有用。該包甚至提供了一個選項來更改\section的定義,以便自動包含一個\FloatBarrier。這可以透過使用選項[section] (\usepackage[section]{placeins}) 載入包來設定。 \FloatBarrier也可以用於防止浮動元素侵入使用itemize或enumerate建立的列表。
flafter 包可以用於強制浮動元素在定義後出現,而endfloat[2] 包可以用於將所有浮動元素放置在文件末尾。
float[3] 包提供了H選項給浮動環境,這將完全阻止它們浮動。
包caption[4]提供了命令\captionof{<type>}{<caption text>},它允許你在不使用浮動環境的情況下排版標題。你可以完全控制圖形和標題的放置位置。
為任何圖形或表格新增標題始終是一個好習慣。幸運的是,在 LaTeX 中這非常簡單。你只需要在浮動環境中使用\caption{''text''}命令。 LaTeX 將自動跟蹤圖形的編號,因此你無需在標題文字中包含它。
標題的位置傳統上位於浮動元素的下方。但是,你可以決定將標題命令插入到浮動元素的實際內容之後(但仍在環境中)。如果將它放在前面,標題將出現在浮動元素之上。嘗試以下示例來演示這種效果
請注意,命令\reflectbox{...}會水平翻轉其內容。
有時希望標題出現在浮動元素的側面,而不是在上方或下方。 sidecap 包可以用於將標題放置在圖形或表格旁邊。以下示例演示瞭如何透過使用SCfigure環境代替figure環境來為圖形實現這一點。 floatrow 包更新且功能更多。
\documentclass{article}
\usepackage{graphicx}
\usepackage{sidecap}
\begin{document}
\begin{SCfigure}
\centering
\caption{ ... caption text ... }
\includegraphics[width=0.3\textwidth]%
{Giraffe_picture}% picture filename
\end{SCfigure}
\end{document}
|
請注意,如果你使用 sidecap 包中的某個環境定義你自己的浮動元素放置位置(預設值為tbp),則需要提供額外的relwidth引數,例如: \{SCfigure}[1][!h]。 |
在某些型別的文件(如簡報)中,可能不希望圖形標題以圖形:開頭。只需將標題文字放在figure環境中,而不將其包含在caption中,就可以輕鬆地禁止這種行為。但是,這意味著沒有標題可用於包含在圖形列表中。
如果你想將表格標題從“表格”重新命名為其他內容,可以使用\captionsetup命令。例如,
\usepackage{caption}
\captionsetup[table]{name=New Table Name}
|
\usepackage{caption} \captionsetup[table] {name=New Table Name}
可以透過使用\listoftables或\listoffigures命令,分別在論文或報告的開頭列出標題,以建立一個“表格列表”或“圖形列表”部分。每個圖形的標題將出現在這些列表中,以及圖形編號和它們所在的頁碼。
\caption命令還有一個可選引數,\caption[''short'']{''long''},它用於表格列表或圖形列表。通常,short描述用於標題列表,而long描述將放置在圖形或表格旁邊。這在標題很長,而圖形/表格列表中只需要“單行”的情況下特別有用。這是一個使用示例
\documentclass[12pt,]{article}
\usepackage{graphicx}
\newcommand{\species}[1]{\textit{#1} sp.}
\begin{document}
\listoffigures
\section{Introduction}
\begin{figure}
\centering
\includegraphics[width=4in]{gecko}
\caption[Close up of \species{Hemidactylus}]
{Close up of \species{Hemidactylus}, which is part the genus of the gecko family. It is the second most speciose genus in the family.}
\end{figure}
\end{document}
|
標籤和交叉引用與一般情況非常相似 - 有關更多資訊,請參見標籤和交叉引用部分。
如果你想標記一個圖形,以便稍後引用它,你必須在標題之後新增標籤(在 LaTeX 2e 中,在裡面似乎可以工作),但在浮動環境中。如果它在外部宣告,它將給出節號。 |
如果標籤獲取了節號或列表號而不是圖形號,請將標籤放在標題內以確保編號正確。如果你在標籤位於標題內時遇到了錯誤,請在\label命令前面使用\protect。
將文字包裹在圖形周圍
[edit | edit source]作者可能希望某些浮動物件不打斷文字流,而是允許文字環繞它。(顯然,這種效果只有在所討論的圖形明顯比文字寬度窄時才看起來不錯。)
警告:在 LaTeX 中環繞圖形需要大量手動調整文件。有幾個包可用於此任務,但沒有一個能完美執行。在決定在文件中包含帶有文字環繞的圖形之前,請確保您已考慮所有選項。例如,您可以使用帶兩列的佈局來製作您的文件,並且根本不使用文字環繞。
無論如何,我們將看一下 wrapfig 包。請注意,wrapfig 可能不會隨 LaTeX 的預設安裝一起提供;您可能需要 安裝額外的包。另外要注意,wrapfig 與 enumerate 和 itemize 環境不相容。
要使用 wrapfig,您必須先在序言中新增以下內容
\usepackage{wrapfig}
|
然後,您可以使用
\begin{wrapfigure}[lineheight]{position}[overhang]{width}
|
行高表示圖形所跨文字行的數量。如果省略此選項,LaTeX 將自動計算該值,但這會導致圖形看起來難看(間距過大)。透過輸入您希望圖形跨越的行數,可以手動覆蓋 LaTeX 的計算。此選項不能以 pt、mm 等表示…
總共有八個可能的定位目標
| r | R | 文字的右側 |
| l | L | 文字的左側 |
| i | I | 內邊緣 - 靠近裝訂線(在 twoside 文件中) |
| o | O | 外邊緣 - 遠離裝訂線 |
大寫字母允許圖形浮動,而小寫字母表示“精確此處”。[4]
圖形的懸垂可以使用 overhang 選項以 pt、cm 等手動設定…
當然,寬度 是圖形的寬度。一個例子
\begin{wrapfigure}{r}{0.5\textwidth}
\begin{center}
\includegraphics[width=0.48\textwidth]{gull}
\end{center}
\caption{A gull}
\end{wrapfigure}
|
|
您還可以讓 LaTeX 為環繞分配寬度,方法是將寬度設定為 0pt:\{wrapfigure}{l}{0pt}
請注意,我們已經為 wrapfigure 環境和我們包含的影像指定了大小。我們以文字寬度來表示:在 LaTeX 中始終最好使用相對大小,讓 LaTeX 為您做工作!“環繞”比圖片略大,因此編譯器不會返回任何奇怪的警告,您將在影像和周圍文字之間有一個小的白色邊框。您可以更改它以獲得更好的結果,但是,如果您不將影像保持在“環繞”的範圍內,您將看到影像覆蓋文字。
wrapfig 包也可以與使用 float 包的使用者定義浮動物件一起使用。請參見下文 關於自定義浮動物件的章節。
帶有太多空白的圖形的技巧
[edit | edit source]您可以使用 intextsep 引數控制圖形上方和下方的額外間距:\setlength\intextsep{0pt}
要控制影像和文字之間的水平間距,請使用 columnsep 引數。
您可能會生成圖形,這些圖形在頂部或底部有太多(或太少)空白。在這種情況下,您只需使用可選引數 [lineheight] 即可。它指定圖形以文字行數表示的高度。還要記住,center 環境在其頂部和底部添加了一些額外的空白;考慮使用命令 \centering 代替。
另一種可能性是在浮動物件內使用 \vspace{...} 命令新增間距。引數是您要新增的間距大小,您可以使用您想要的任何單位,包括 pt、mm、in 等。如果您提供負引數,它將新增一個負間距,從而去除一些空白。使用 \vspace 往往會使標題相對於浮動物件移動,而 [lineheight] 引數不會。以下是用 \vspace 命令的示例,程式碼與前面的情況完全相同,我們只是添加了一些負垂直間距來縮小所有內容
\begin{wrapfigure}{r}{0.5\textwidth}
\vspace{-20pt}
\begin{center}
\includegraphics[width=0.48\textwidth]{gull}
\end{center}
\vspace{-20pt}
\caption{A gull}
\vspace{-10pt}
\end{wrapfigure}
|
![]() |
在這種情況下,它可能看起來太小了,但您可以按照自己的喜好管理間距。通常,最好根本不新增任何間距:讓 LaTeX 完成格式化工作!
(在這種情況下,問題是使用 \{center} 來居中影像。 center 環境會新增額外的間距,如果使用 \centering 代替,則可以避免這些間距。)
或者,您可以使用 picins 包而不是 wrapfig 包,該包會在沒有任何手動調整的情況下生成沒有多餘空白的正確版本。
wrapfig 也有一個替代方案:floatflt 包 [5]。
要永久刪除圖形中的空白,應該參考 pdfcrop 程式,該程式包含在大多數 TeX 安裝中。
子浮動物件
[edit | edit source]一個有用的擴充套件是 subcaption[6] 包,它在單個浮動物件中使用子浮動物件。 subfig 包(subfigure 包已棄用[5])是與 LaTeX 模板(即 來自 Springer 和 IOP、IEEETran 和 ACM SIG 的期刊模板)一起使用時的一個有用替代方案,這些模板與 subcaption 不相容。這些包使作者能夠在圖形中包含子圖形,或者在表格浮動物件中包含子表格。子浮動物件有自己的標題,以及一個可選的全域性標題。以下示例將最好地說明 subcaption 包的使用方法
\usepackage{graphicx}
\usepackage{subcaption}
\begin{figure}
\centering
\begin{subfigure}[b]{0.3\textwidth}
\includegraphics[width=\textwidth]{gull}
\caption{A gull}
\label{fig:gull}
\end{subfigure}
~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc.
%(or a blank line to force the subfigure onto a new line)
\begin{subfigure}[b]{0.3\textwidth}
\includegraphics[width=\textwidth]{tiger}
\caption{A tiger}
\label{fig:tiger}
\end{subfigure}
~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc.
%(or a blank line to force the subfigure onto a new line)
\begin{subfigure}[b]{0.3\textwidth}
\includegraphics[width=\textwidth]{mouse}
\caption{A mouse}
\label{fig:mouse}
\end{subfigure}
\caption{Pictures of animals}\label{fig:animals}
\end{figure}
|

您會注意到,figure 環境的設定與往常一樣。您也可以使用 table 環境來建立子表格。對於每個子浮動物件,您需要使用
\begin{table}[<placement specifier>]
\begin{subtable}[<placement specifier>]{<width>}
\centering
... table 1 ...
\caption{<sub caption>}
\end{subtable}
~
\begin{subtable}[<placement specifier>]{<width>}
\centering
... table 2 ...
\caption{<sub caption>}
\end{subtable}
\end{table}
|
如果您打算交叉引用任何子浮動物件,請檢視標籤的插入位置;\caption 在 subfigure 環境之外將提供全域性標題。
subcaption 將並排排列圖形或表格,前提是它們可以容納,否則,它將自動將子浮動物件移到下面。可以透過在您希望移動到新行的圖形之前新增換行符命令(\\)來手動新增此效果。
圖形之間的水平間距由幾個命令之一控制,這些命令放置在 \{subfigure} 和 \end{subfigure} 之間
- 可以用一個不間斷空格(如上面的示例中使用 ~ 表示)在子圖形之間插入空格。
- 數學空格:
\qquad、\quad、\;和\, - 通用空格:
\hspace{''長度''} - 自動擴充套件/收縮空格:
\hfill
多部分圖形
[edit | edit source]有時您需要將圖形分成多個浮動物件,例如,因為圖形太大而無法容納在一個頁面上。在這種情況下,您可以使用續接圖形,方法是使用 caption 包。
將以下內容放在序言中
\usepackage{caption}
\DeclareCaptionLabelFormat{cont}{#1~#2\alph{ContinuedFloat}}
\captionsetup[ContinuedFloat]{labelformat=cont}
|
然後,您可以按照以下方式使用續接浮動物件。
如果您正在使用兩列編寫文件(例如,您的文件以類似於 \documentclass[twocolumn]{article} 的內容開始),您可能會注意到無法使用比一列寬度更寬的浮動元素(使用 LaTeX 表示法,比 0.5\textwidth 更寬),否則您將看到影像與文字重疊。如果您確實需要使用這種寬元素,唯一的解決方案是使用浮動環境的“帶星號”變體,即 {figure*} 和 {table*}。這些“帶星號”版本的工作方式與標準版本類似,但它們將與頁面一樣寬,因此您不會出現重疊。
這些環境的一個缺點是,它們只能放置在頁面的頂部或其自己的頁面上。如果您嘗試使用諸如 *b* 或 *h* 之類的修飾符指定它們的位置,它們將被忽略。將 \usepackage{dblfloatfix} 新增到序言中,以緩解使用可選說明符 [b] 將這些浮動元素放置在頁面底部的問題。預設值為 [tbp]。但是,*h* 仍然不起作用。
如果表格和圖形不適合您的需求,那麼您始終可以選擇建立自己的!此類例項的示例可以是原始碼示例或地圖。因此,對於程式浮動元素示例,您可能希望建立一個名為 program 的浮動元素。float 包是您完成此任務的朋友。設定新浮動元素的所有命令必須放在序言中,而不是文件中。
- 將
\usepackage{float}新增到文件的序言中 - 使用以下命令宣告您的新浮動元素:
\newfloat{type}{placement}{ext}[outer counter],其中- type - 您要呼叫浮動元素的新名稱,在本例中為 'program'。
- placement - t、b、p 或 h(如 放置 中所述),其中字母列舉了允許的放置位置。
- ext - 圖表列表(或任何其他)的輔助檔案的副檔名。LaTeX 將標題寫入此檔案。
- outer counter - 此引數的存在表明與該新浮動元素關聯的計數器應取決於外部計數器,例如 'chapter'。
- 標題開頭顯示的預設名稱是型別。如果您想更改此名稱,請使用
\floatname{type}{floatname} - 使用
\floatstyle{style}可以更改浮動元素樣式(適用於所有後續的\newfloat命令,因此,必須在\newfloat之前插入才能生效)。- plain - LaTeX 浮動元素的正常樣式,但標題始終位於內容下方。
- plaintop - LaTeX 浮動元素的正常樣式,但標題始終位於內容上方。
- boxed - 繪製一個包圍浮動元素的框,標題在下方列印。
- ruled - 標題出現在浮動元素上方,在浮動元素的上下方都有規則。然後是浮動元素內容,最後是水平規則。
浮動元素樣式也可以像下面的第二個示例一樣自定義。
使用新的 program 浮動元素型別的示例文件
\documentclass{article}
\usepackage{float}
\floatstyle{ruled}
\newfloat{program}{thp}{lop}
\floatname{program}{Program}
\begin{document}
\begin{program}
\begin{verbatim}
class HelloWorldApp {
public static void main(String[] args) {
//Display the string
System.out.println("Hello World!");
}
}
\end{verbatim}
\caption{The Hello World! program in Java.}
\end{program}
\end{document}
|
verbatim 是一個環境,已經在 特殊段落 中討論過。它非常適合原始碼,但如果您想引入大量程式碼,您可能需要考慮使用在 原始碼列表 中描述的 listings 包,該包專門為此而設計。
雖然這很有用,但在將浮動元素嵌入另一個浮動元素時應小心。特別是,錯誤
not in outer par mode
可能會出現。一個可能的解決方案是在內部浮動元素上使用 [H] 選項(而不是其他任何選項),因為此選項會將內部浮動元素“固定”到外部浮動元素。
使用 \newfloat 建立的新浮動元素也可以與上面的 wrapfig 包組合使用。例如,以下程式碼建立了一個浮動文字框,該文字框在頁面右側的文字中浮動,並且包含標題、編號、副檔名為 .lob 的索引檔案以及浮動元素視覺佈局的自定義
\documentclass{article}
% have hyperref package before float in order to get strange errors with .\theHfloatbox
\usepackage{hyperref}
\usepackage{float}
% allows use of "@" in control sequence names
\makeatletter
% this creates a custom and simpler ruled box style
\newcommand\floatc@simplerule[2]{{\@fs@cfont #1 #2}\par}
\newcommand\fs@simplerule{\def\@fs@cfont{\bfseries}\let\@fs@capt\floatc@simplerule
\def\@fs@pre{\hrule height.8pt depth0pt \kern4pt}%
\def\@fs@post{\kern4pt\hrule height.8pt depth0pt \kern4pt \relax}%
\def\@fs@mid{\kern8pt}%
\let\@fs@iftopcapt\iftrue}
% this code block defines the new and custom floatbox float environment
\floatstyle{simplerule}
\newfloat{floatbox}{thp}{lob}[section]
\floatname{floatbox}{Text Box}
\begin{document}
\begin{floatbox}{r}{}
\textit{Bootstrapping} is a resampling technique used
for robustly estimating statistical quantities, such as
the model fit $R^2$. It offers some protection against
the sampling bias.
\caption{Bootstrapping}
\end{floatbox}
\end{document}
|
要更改標題的外觀,請使用 caption [7] 包。例如,要使所有標題標籤變小且加粗
\usepackage[font=small,labelfont=bf]{caption}
|
KOMA 指令碼包 [8] 有自己的標題自定義功能,例如 \captionabove、\captionformat 和 \setcapwidth。但是,這些定義對使用 wrapfig 包新建立的浮動環境的影響有限。
或者,您可以重新定義 \thefigure 命令
\renewcommand{\thefigure}{\arabic{section}.\arabic{figure}}
|
有關計數器的更多資訊,請參閱 此頁面。最後,請注意 caption2 包已長期棄用。
有一個 LaTeX 包 lpic [9] 用於在包含的圖形頂部放置 LaTeX,從而允許在匯入的圖形中新增 TeX 註釋。它定義了一個方便的介面,用於將 TeX 放置在包含的圖形之上,並允許在排版材料下方繪製白色背景以遮蓋圖形。它是圖形內標籤的更好替代方案;您不必在調整圖片大小後更改文字大小,並且所有 LaTeX 功能都可用於標籤。
一個非常類似的包,語法略有不同,是 pinlabel [10]。給出的連結也指向 psfrag 和 overpic 包。
一個更復雜的包,可以用相同的方式使用,是 TikZ。TikZ 是一個名為 pgf 的繪相簿的前端(例如,用於製作 beamer)。它可用於透過在影像節點頂部新增文字節點來標記圖形。
這涵蓋了浮動元素的所有基本內容。您希望能夠了解讓 LaTeX 完成所有繁重工作並調整頁面佈局以將您的圖形放置在最佳位置有多麼容易。與往常一樣,LaTeX 處理所有標題和參考編號的事實可以節省大量時間。
- ↑ http://www.ctan.org/tex-archive/macros/latex/contrib/float/
- ↑ Float environment positioning, by Frank Mittelbach
- ↑ http://tex.stackexchange.com/questions/28556/how-to-place-a-float-at-the-top-of-a-floats-only-page
- ↑ http://ftp.univie.ac.at/packages/tex/macros/latex/contrib/wrapfig/wrapfig-doc.pdf
- ↑ http://ctan.org/pkg/subfigure
此頁面使用了 Andy Roberts 的 LaTeX 入門 材料,經作者許可。





