LaTeX技巧926:LaTeX 中的浮動體:擺放多個子元素

這是這一系列文章,也是計劃中的最后一篇。此篇介紹復雜一些的話題:如何在浮動體中擺放多個元素,以及如何處理它們的題注(caption)。

思想一旦被禁錮,心靈就會孱弱。

浮動體是會移動的文本框

解放思想,然后解放生產力。

浮動體這個概念,對于大多數 LaTeX 用戶來說,應該都有隔著一層紗的感覺。考慮到大多數 LaTeX 用戶是從 M$ Word 開始接觸電子文檔,也沒有機會接觸專業排版的機會,這種現象并不奇怪:因為大多數用戶沒有養成關于排版規則和成因的思考習慣。 在系列文章第一篇中,我們介紹了「為什么需要浮動體」。簡單來說,諸如圖片表格這種占據篇幅較大的內容,強行插入在「當前位置」是不合適的,通常會造成大片的空白,因此需要浮動。為此,LaTeX 的浮動機制允許用戶將圖表置于浮動體中,按照一定算法在文中浮動。 對于有過 M$ Word 使用經驗的用戶來說,理解 LaTeX 中的浮動體,最簡便的方式是將其理解為「一個支持 \caption 會按照算法浮動位置的文本框」。在 M$ Word 當中,文本框中可以放置任意內容;在 LaTeX 浮動體中也是一樣。在 M$ Word 當中,文本框可以沒有 \caption,在 LaTeX 浮動體中也是一樣。

\documentclass{article}
\usepackage{mwe}  % for dummy text
\begin{document}
Foo
\begin{figure}[htb]  % a float environment without \caption containing text
\blindtext
\end{figure}
bar
\end{document}

可以看到,LaTeX 中的浮動體中,字體、分詞、折行等行為,與正文中一般無二;只不過,由于 figure 環境整體浮動,讓 Foobar 排在了同一行,而 \blindtext 的輸出則浮動到了 Foo bar 的下方。

多個元素

上例中,我們在浮動體(figure 環境)中插入了一段文本(由 \blindtext 生成),以此來演示浮動體內的排版邏輯。事實上,由于 TeX 的排版過程實際是一個盒子套盒子的搭積木的過程(TeX 在排版時不關心具體內容,只關心描述每個元素尺寸的 bounding box),上例中我們已經可以認為是在浮動體中插入了多個元素了。接下來的任務,只需要將圖片或者表格想像為「特別大的字符」,套用排版的基本邏輯,就能在浮動體內排版多個圖表元素了。

\documentclass{article}
\usepackage{mwe}  % for dummy text
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\rule{4cm}{3cm}\quad\rule{4cm}{3cm}\quad\rule{4cm}{3cm}\quad\rule{4cm}{3cm}
\end{figure}
bar
\end{document}

geometry 宏包的輔助下,可以看到,浮動體中擺放了 4 個黑色的標尺(\rule{<width>}{<height>})。這 4 個標尺是對圖表的模擬——若是將 \rule 命令換成 \includegraphics,則得到 4 張圖片;若是將 \rule 命令換成 tabular 等環境,則得到 4 個表格。前文說,TeX 排版時不關心內容,只關心尺寸,因此可以把圖表都想像為特別大的字符,而后套用正常的排版邏輯即可。此處,在浮動體內,同一行有 4 個「字符」;由于寬度不夠擺放 4 個字符,所以 TeX 在第三個字符之后折行,在下一行排版第四個字符。因此得到這樣的排版結果。

題注是有一定格式的編號文本

因為不了解,所以不敢輕易嘗試。

對于浮動體的處理,另外一個重要的部分是對題注的處理。基于同樣的原因,很多 LaTeX 初學者對題注知之甚少。特別地,由于使用「交叉引用」的意識淡薄,大多數 M$ Word 基礎用戶完全不知道有「題注」這個東西。于是,當他們轉而使用 LaTeX 的時候,一方面感嘆于 \caption 的易用性,另一方面恐怕會對之心存敬畏。 在 LaTeX 輸出的一個典型題注的代碼如下:

\documentclass{article}
\usepackage{mwe}  % for dummy text
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\rule{4cm}{3cm}\quad\rule{4cm}{3cm}\quad\rule{4cm}{3cm}\quad\rule{4cm}{3cm}

\caption{Foo bar.}
\end{figure}
bar
\end{document}

其中,Figure 1 是題注的「標簽(label)」,其中由包含題注類型和編號;Foo bar. 是題注的「文本(text)」;標簽和文本之間則是「分隔符(label sep)」,此處是 :。 不難發現,題注的默認格式大致是:

  • 居中:\centering

  • 羅馬字族:\rmfamily

  • 直立字形:\upshape;

  • 標準字體大小:\normalsize

  • 標準字重:\mdseries

若想修改題注的格式,可以用 caption 宏包(而不是 caption2)。

在此基礎上,我們可以嘗試做各種奇怪的事情。

插入一個手工題注

由于浮動體其實只是一個文本框,所以我們可以向其中添加任何內容。對于題注來說,作為實驗用途,我們完全可以按照格式,手工創建一個題注。

\documentclass{article}
\usepackage{mwe}  % for dummy text
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\rule{4cm}{3cm}\quad\rule{4cm}{3cm}\quad\rule{4cm}{3cm}\quad\rule{4cm}{3cm}

\centering
{\rmfamily\upshape\normalsize\mdseries Figure 1: Foo bar.}
\end{figure}
bar
\end{document}

從效果上說,除了沒有自動編號,與 \caption 生成的題注一般無二。

使用多個 \caption

同樣,由于 \caption 只是一個格式化輸出的宏,LaTeX 也不會禁止我們在同一個浮動體中多次使用 \caption

\documentclass{article}
\usepackage{mwe}  % for dummy text
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\rule{4cm}{3cm}\quad\rule{4cm}{3cm}\quad\rule{4cm}{3cm}\quad\rule{4cm}{3cm}

\caption{Foo.}
\caption{Bar.}
\end{figure}
bar
\end{document}

可以看到,兩個題注格式相同,分別編號,先后排版在居中位置。

關于圖表題注位置的區別

本段插入一些擴展內容。

一般來說,在學術論文中,表格的題注至于表格之前,而圖片的題注至于圖片之后。其原因大致可說明如下:

It has to do with the way people absorb printed information or, more accurately, how readers of Western texts are acculturated into this. Tables are textual devices and are, to some or other approximate degree, structured to be read in the same left->right, top->bottom order (*). To this degree, they therefore do not differ in important information processing ways from the body text. Normal text (not, e.g., poetry or other intentionally disruptive forms) is ordinarily structured in a “pyramidal” form: general and introductory concepts are best placed at the beginning, with increasingly fleshed-out details placed later on. The reading eye that saccades across text and the brain that controls it has learnt beginning at the age of two or whatever to most efficiently gather (Western) textual information in this way. By our age, we cannotnot process text this way. Graphics, on the other hand, are iconic. The eye does not scan pictures for information in remotely the same way (in fact entirely different cerebral systems are in charge of gathering and interpreting textual and graphical information - you can knock out one part of the brain and impair one system without noticeably affecting the performance of the other; see, e.g., almost any popular writing by Oliver Sachs). It would be almost impossible to prevent the normal human brain from scanning and interpreting, no matter how briefly, a picture on the page before forcing it to reading the caption (no matter where the caption is placed because by that time the attentional mechanisms in the part of the brain that is now switched on is directing the eye to saccade in non-linear sequences). So, to answer your question, good typesetting sets out to provide readers the most productive (rate of information processing for expended effort) reading experience that it can. For text: the caption summary is placed above the details to fit in with linear eye saccades and the pyramid principle of text interpretation; for graphics: the graphic is placed first to fit in with quite different attentional control mechanisms, non-linear eye saccading and non-linear information processing. () Factor in acculturation. Good typesetting for R->L or bottom->top reading orders will follow these general principles (for biologically human species (*)) , leading however to different outcomes. (**) The point is that it’s our brain biology that has ultimately led to the development of these rules. Here’s something to think about: what are the optimal typesetting rules for non-human species, e.g., maybe sapient machines, or echo-locating information gatherers like bats or porpoises. Where would they like to “see” their captions? :))graphics - Why should a table caption be placed above the table?

簡單來說,這樣的設計是為了方便人們更舒服地閱讀文章。 人類閱讀表格和圖片的方式是不一樣的。表格也算是一種文字信息,人們閱讀它和平時閱讀整塊文本的習慣相符合,大致是:從上到下、從左到右。因此,表格標題這種總結提示性的信息,應該放在表格開始之前。圖片與表格不同,人類大腦處理圖片的方式與表格大相徑庭,甚至閱讀圖片時激活的大腦區域也與處理表格時不同。對于人類來說,在正常的閱讀過程中,強迫先閱讀圖片標題而后閱讀圖片,要不然做不到,要不然做到了也很難受。因此,不如就把圖片放前面,讓大腦處理完之后再去閱讀圖片標題。 當然,這本質上是一個約定行為。如果雜志社要求你按照固定的方式去擺放圖標及其標題,你卻非要按照你的習慣去做——這屬于自己找事。不過,基于上述考慮,圖片先于標題而表格后于標題,幾乎已經是約定俗成的了。

多個元素與題注

文章行文至此,大多數用戶應該已經能構建出一些在浮動體中排版多個元素的代碼,并為他們附上題注了。不考慮子題注,在浮動體中插入兩個元素,按照元素排布形狀和題注規律,大致有以下一些組合。

  • 并排擺放,無題注

  • 并排擺放,共享題注

  • 并排擺放,各自題注

  • 縱向擺放,無題注

  • 縱向擺放,共享題注

  • 縱向擺放,各有題注(無用,因為可以分割成兩個浮動體)

由于元素排布形狀和題注是相互獨立控制的,因此,此處無須給出所有可能的結果,就足夠讀者舉一反三了。

并排擺放,無題注

所有并排擺放的要點,都只有一個:讓同一行內所有元素的總寬度不大于允可的寬度。因此,很容易構建出如下代碼。

\documentclass{article}
\usepackage{graphicx}
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\centering
\includegraphics[width = .48\linewidth]{example-image-a}\hfill
\includegraphics[width = .48\linewidth]{example-image-b}
\end{figure}
bar
\end{document}

此處以 \includegraphics 的參數控制,兩幅圖片的寬度和為 0.96\linewidth,小于允可的寬度(\linewidth)。因此,兩副圖片能夠并排擺放。

并排擺放,共享題注

相比上一節的代碼,只需加上題注即可。

\documentclass{article}
\usepackage{graphicx}
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\centering
\includegraphics[width = .48\linewidth]{example-image-a}\hfill
\includegraphics[width = .48\linewidth]{example-image-b}
\caption{Dummy Caption.}
\end{figure}
bar
\end{document}

并排擺放,各自題注

由于題注是針對當前環境居中的;因此,若我們希望為并排擺放的兩個圖片分別添加題注,就需要讓并排擺放的兩個圖片分別處于單獨的盒子當中。

\documentclass{article}
\usepackage{graphicx}
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\centering
\begin{minipage}{0.48\linewidth}
\centering
\includegraphics[width = \linewidth]{example-image-a}
\caption{Dummy Caption A.}
\end{minipage}\hfill
\begin{minipage}{0.48\linewidth}
\centering
\includegraphics[width = \linewidth]{example-image-b}
\caption{Dummy Caption B.}
\end{minipage}
\end{figure}
bar
\end{document}

代碼中,我們用 minipage 環境將兩個圖片和他們分別的題注放在一起。這樣,兩張圖片并排擺放,分別有題注。注意,由于圖片放在小頁環境中,所以 \includegraphics 環境的寬度參數應改為 \linewidth,表示小頁環境當中的行寬。

縱向擺放,無題注

橫向擺放的要點在于同一行的元素總寬度不大于允可的寬度,這是了解到浮動體文本框內排版邏輯之后的直接推論。有此了解之后,控制兩個元素縱向擺放也就很簡單了:只需要讓兩個元素的總寬度大于允可的寬度,或是手工換行即可。

\documentclass{article}
\usepackage{graphicx}
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\centering
\includegraphics[width = .6\linewidth]{example-image-a}\\[2ex]
\includegraphics[width = .6\linewidth]{example-image-b}
\end{figure}
bar
\end{document}

多個元素與子題注

有時,我們會希望給每個元素分別加上題注,但同時又共享一個題注。這時候,每個元素的題注就應該是共享的題注的子題注。 為了使用子題注,應該使用 subfig 宏包(提供了 \subfloat 命令)或者 subcaption 宏包(適合與 caption 宏包聯用,提供了 \subcaption 等命令)。

使用 subfig 宏包

subfig 宏包的核心即是 \subfloat 命令;\subfloat 命令為其中的內容(圖片或表格)創建了一個盒子,并支持設置子題注。具體用法如下。

\documentclass{article}
\usepackage{graphicx}
\usepackage{subfig}
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\centering
\subfloat[Subcaption A]{\includegraphics[width = .48\linewidth]{example-image-a}}\hfill
\subfloat[Subcaption B]{\includegraphics[width = .48\linewidth]{example-image-b}}
\caption{Two figures.}
\end{figure}
bar
\end{document}

使用 subcaption 宏包

subcaption 宏包適合與 caption 宏包聯用。因此,若文檔中已經使用了 caption 調整題注的樣式,首先應考慮 subcaption 宏包來實現子題注。subcaption 提供的 \subcaption 命令是實現子題注最簡便的方式:只需要在上述「并排擺放,各有標題」的基礎上,將 \caption 命令替換成 \subcaption 命令即可。

\documentclass{article}
\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\centering
\begin{minipage}{0.48\linewidth}
\centering
\includegraphics[width = \linewidth]{example-image-a}
\subcaption{Dummy Subcaption A.}
\end{minipage}\hfill
\begin{minipage}{0.48\linewidth}
\centering
\includegraphics[width = \linewidth]{example-image-b}
\subcaption{Dummy Subcaption B.}
\end{minipage}
\caption{Dummy Caption.}
\end{figure}
bar
\end{document}

雖然 \subcaption 用起來方便,但是由于外面要套一層小頁環境,所有代碼加在一起就很繁瑣了。為此,可以使用 subcaption 宏包提供的另一個命令:\subcaptionbox\subcaptionbox 的用法類似 \subfloat

\documentclass{article}
\usepackage{graphicx}
\usepackage{caption}
\usepackage{subcaption}
\usepackage[showframe]{geometry}  % for showing frames of pages
\begin{document}
Foo
\begin{figure}[htb]
\centering
\subcaptionbox{Dummy Subcaption A.}{\includegraphics[width = .48\linewidth]{example-image-a}}\hfill
\subcaptionbox{Dummy Subcaption B.}{\includegraphics[width = .48\linewidth]{example-image-b}}
\caption{Dummy Caption.}
\end{figure}
bar
\end{document}

擴展閱讀

至此,此篇文章需要介紹的內容就此完結,本系列也即將宣告結束。以下是一些擴展閱讀。

  • caption 宏包:提供了一系列控制題注格式的接口;

  • subcaption 宏包:提供了控制子題注的接口,適合與 caption 宏包聯用;

  • subfig 宏包:提供了控制子題注的借口;

  • floatrow 宏包:提供了更多的控制浮動體格式的接口。

選自:https://liam0205.me/2018/01/11/floats-in-LaTeX-multiple-elements-in-a-single-float/

分享到:
未經允許不得轉載:LaTeX技巧926:LaTeX 中的浮動體:擺放多個子元素
已有 條意見

    最新文章

    加載中...
      本站提供專業LaTeX排版、咨詢、定制服務,請點擊下圖咨詢詳情


      全國首個精品的LaTeX視頻教程,大牛帶著你入門,讓LaTeX學習不再糾結,請點擊下圖咨詢詳情

      熱門評論

        聯系我們

        交流QQ群:91940767
        本站QQ號:343083553
        郵箱聯系[email protected]
        淘寶店鋪https://shop240512713.taobao.com/ 提供排版,模板定制,培訓,圖片處理,視頻教程等LaTeX服務。

        關注我們微信公眾號

        如果您投稿或者希望加入我們團隊,請發送您的簡歷到[email protected]
        飞艇人工免费计划下载