LaTeX技巧896:LaTeX 中的浮動體:處理超寬問題

前文說了,浮動體主要是處理高度比較大,又不方便分割的內容:比如圖片和表格。實際上,此類內容除了在高度上可能很高,它們也可能很寬。LaTeX 在水平方向,會貼著版芯的左邊邊界,開始排列內容。因此,如果一張圖片或者表格的寬度超過了版芯的寬度,那么看起來就像是沒有居中,而是偏右。

此篇我們講一下如何處理此類情況。

縮小

對付內容過大,最直接的辦法,就是把它們縮小。對于圖片,如果使用了 graphicx 宏包,我們可以使用 width = \linewidth 的參數將圖片縮放到正好填滿頁面寬度的大小,避免「超寬」。對于表格等其他內容,我們可以使用 graphicx 提供的 \resizebox 命令來處理。

\documentclass{article}
\usepackage{showframe}
\usepackage{graphicx}
\begin{document}
\begin{table}[!htb]
\centering
\caption{Oh, this table is overfull!}\label{tab:overfull}
\rule{1.1\linewidth}{3cm}
\end{table}

\begin{table}[!htb]
\centering
\caption{Imagine that this is a table.}\label{tab:resized}
\resizebox{\linewidth}{!}{\rule{1.1\linewidth}{3cm}}
\end{table}

\begin{figure}[!htb]
\centering
\includegraphics[width = \linewidth]{example-image}
\caption{A fit figure.}\label{fig:example-image}
\end{figure}

想辦法居中

上述通過縮小解決問題,是一種辦法。但是,在很多情況下,也會存在問題;比如

  • 表格內容縮小之后,就看不清了;

  • \verb 之類的內容,不能放在大多數 box 之內。

為此,我們需要用別的辦法,嘗試解決這些問題。 實際上,大多數用戶對于這類問題最大的訴求在于:為什么這些超寬的圖表不局中了?所以,我們只要解決「居中」的問題,可能就覆蓋了絕大部分用戶的需求。而這些內容無法居中的原因,我們在介紹部分也說過了:LaTeX 在水平方向,會貼著版芯的左邊邊界,開始排列內容。因此,如果我們能讓 LaTeX 不從版芯的最左邊開始排列內容,就有可能解決這個問題。 決定 LaTeX 從何處開始排列內容的,是 \leftskip 這個宏。在 LaTeX2e 中,它被默認定義為 \[email protected]。也就是說,從版芯的左邊邊界處開始排列內容。我們可以修改這個宏,比如改為 \setlength{\leftskip}{-20pt},那么 LaTeX 將從版芯左邊邊界左邊的 20pt 的位置開始排列內容。

\documentclass{article}
\usepackage{showframe}
\usepackage{graphicx}
\begin{document}
\begin{table}[!htb]
\centering
\caption{Oh, this table is overfull!}\label{tab:overfull}
\setlength{\leftskip}{-20pt}
\rule{1.1\linewidth}{3cm}
\end{table}
\end{document}

同理,我們有 \rightskip,用于確定水平方向排版的終止位置與版芯右邊界之間的距離。 我們知道,TeX 的 skip 是所謂的「彈簧」,允許在一定程度上進行縮放;而所謂的居中,實際上就是在版芯兩側,有兩個力量相等的無限彈簧,同時向中間擠壓內容。因此,我們不難得到對 \leftskip\rightskip 的幾個要求:

  • 默認情況,應該貼著兩側邊界;

  • 最差的情況,應該允許內容向左右兩側延伸,超過版芯但不超過紙張寬度;

  • 同時具有讓內容居中的能力。

因此,我們可以將它們設置為(粗略地):

\setlength{\leftskip}{0pt plus 1fil minus \marginparwidth}
\setlength{\rightskip}{\leftskip}

為了讓它更好用,我們可以把他們收納在一個新的命令當中(包含了一些額外的工作):

\documentclass{article}
\usepackage{showframe}
\usepackage{graphicx}
\makeatletter
\newcommand*{\centerfloat}{%
  \parindent \[email protected]
  \leftskip \[email protected] \@plus 1fil \@minus \marginparwidth
  \rightskip \leftskip
  \parfillskip \[email protected]}
\makeatother
\begin{document}
\begin{table}[!htb]
\centerfloat
\caption{Oh, this table is adjusted!}\label{tab:adjusted}
\rule{1.1\linewidth}{3cm}
\end{table}
\end{document}

當然,你也可以通過 \makebox 命令來達成目標,不過這樣依然無法容納含有類似 \verb 的內容:

\documentclass{article}
\usepackage{showframe}
\usepackage{graphicx}
\begin{document}
\begin{table}[!htb]
\centering
\caption{Oh, this table is adjusted!}\label{tab:adjusted}
\makebox[0pt][c]{\rule{1.1\linewidth}{3cm}}
\end{table}
\end{document}

使用 adjustbox 宏包

Martin Scharrer 有發布名為 adjustbox 的宏包,提供了類似 graphicx 宏包中 \includegraphics 命令的 key-value 參數,用以實現各類 box 效果。值得一提的是,宏包提供的幾個宏、環境,都可以容納 \verb 之類的內容。很是好用。

\documentclass{article}
\usepackage{showframe}
\usepackage{adjustbox}
\begin{document}
\begin{table}[!htb]
\centering
\caption{Oh, this table is adjusted by the package adjustbox!}\label{tab:adjusted}
\adjustbox{center}{\rule{1.1\linewidth}{3cm}}
\end{table}
\end{document}

效果和使用我們定義的 \centerfloat 命令類似,這里就不重復貼圖了。

倘若把它倒過來……

上面的介紹,基本都僅限于處理 overfull 程度不大、超出版芯程度不多的情形。如果你有一個大胖娃娃,他/她使得版芯寬度嚴重超載,那么你可能要考慮把它旋轉九十度了。rotating 宏包提供了 sidewaystablesidewaysfigure 環境(以及帶 * 的版本,用于在雙欄模式下通欄排版),分別作為對應 tablefigure 的工具。使用這些環境,能使圖表旋轉 90° 擺放。

\documentclass{article}
\usepackage{showframe}
\usepackage{rotating}
\begin{document}
\begin{sidewaystable}[!htb]
\centering
\caption{Let's rock!}\label{tab:rotated}
\rule{0.8\linewidth}{3cm}
\end{sidewaystable}
\end{document}

需要注意的是,當旋轉過來之后,「長寬」就交換了。因此,我們這里使用 0.8\linewidth 實際上是相對版芯的高度的 0.8 倍。此外,rotating 宏包默認將內容逆時針旋轉了 90°,你也可以在調用宏包時傳入 clockwise 參數,得到順時針旋轉的版本。選自:http://liam0205.me/2017/03/22/floats-in-LaTeX-handle-overfull-floats/

分享到:
未經允許不得轉載:LaTeX技巧896:LaTeX 中的浮動體:處理超寬問題
已有 條意見

    最新文章

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


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

      熱門評論

        聯系我們

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

        關注我們微信公眾號

        如果您投稿或者希望加入我們團隊,請發送您的簡歷到[email protected]

        科技藝術的完美融合,專業精致的排版體驗

        聯系我們聯系我們
        飞艇人工免费计划下载