LaTeX插圖

【注】筆記來自《LaTeX入門》——劉海洋。

1. 簡介

插圖功能是利用 TeX 的特定編譯程序提供的機制實現的,不同的編譯程序支持不同的圖形方式。不同 LaTeX 編譯程序對應的插圖格式如下表所示:

TeX 引擎命令 圖形驅動 支持的格式 說明
latex Dvips EPS MiKTeX 還部分支持 PNG 和 JPEG
latex DVIPDFMx EPS,PDF,PNG,JPEG PDF、PNG、JPEG 需要使用 extractbb 程序生成 .xbb 文件
pdflatex - MPS、PDF、PNG、JPEG MPS 是 METAPOST 的輸出格式,TeXLive 2010 以後還能自動將 EPS 轉換爲 PDF 文件產插入
xelatex xdvipdfmx EPS、PDF、PNG、JPEG、BMP 驅動是自動調用的,MAC 系統下的舊驅動 xdv2pdf 還支持其他一些格式

由上表可知,除非使用傳統的 Dvips 程序作爲圖形驅動,一般編譯程序支持的圖形格式都有好幾種,實際插入圖形格式也就有不同的選擇。對於 pdfLaTeX、XeLaTeX 這些現代的常用編譯程序來說,PDF、PNG、JPEG 這三種格式是更爲常用的,它們的用途也各自不同:

  • PDF圖片通常用來作爲矢量圖形的標準格式。矢量圖形可以以任意比例放縮而不影響輸出效果,在表現固定圖案或數據產生的圖形時很有優勢。在以前 LaTeX 更多使用 EPS 格式的矢量圖形,不過由於現在支持輸出 PDF 的作圖軟件變得更加普及,而且 PDF 格式的文件通常比相同內容的 EPS 圖形體積小,功能(如透明色)也更多。一般的矢量圖設計軟件(如 Illustrator、CorelDraw、Inkscape)、專業數學軟件(如 MatLab、Maple、Mathematica)、計算或作圖語言(如 R、GNUplot)、圖論或流程圖工具(如 Visio、Dia、Graphviz)、物理化學或工程圖工具(如 JaxoDraw、ChemDraw、AutoCAD)等,都可以保存或打印爲 PDF 格式的圖片共 LaTeX 使用。
  • PNG 圖片是無損壓縮的像素圖格式。通常用來顯示計算機制作的非自然圖形,如複雜數據可視化結果。一般能輸出矢量圖的軟件也都可以輸出 PNG 格式的像素圖,也有一些科技作圖軟件不支持矢量圖的。通常數據可視化的圖形最好使用矢量圖格式,不多對於一些特殊情形,如逐點產生的動力系統圖像、3D CG 圖,還是更適合使用 PNG 格式。
  • JPEG 圖片是有損壓縮的像素圖格式。通常用作照片的格式。計算機產生的非自然圖像最好不要使用這種有損壓縮格式。

2. 基礎

在 LaTeX 中,插圖是由 graphicsgraphicx 宏包所使用的 \includegraphics 命令完成的。graphics 宏包和 graphicx 宏包在功能上並沒有什麼差別。graphicx 宏包支持 <項目>=<值> 的語法,使用起來更爲方便,功能也更爲強大。

graphicx 宏包可以使用 draftfinal 選項,用來表示是否實際插圖。當宏包使用 draft 選項,或是文檔使用全局的 draft 選項時,\includegraphics 命令並不會實際插入圖形,而只是得到一個與圖形大小相同的帶有文件名的方框,這個選項對於未完成的草稿可以在一定程度上加快編譯,並減小文件大小。當文檔完成時,就可以更改 draft 選項爲 final 選項,得到最終的文檔。

\usepackage[draft]{graphicx}
% 導言區
% ……
\includegraphics{picture}

graphicx 宏包還有一個特別有用的命令 \graphicspath,它可以指定圖形文件的搜索目錄列表,不同的目錄用分組隔開:

\graphicspath{{figures/}}           % 指定圖片路徑
\graphicspath{{pdf/}{png/}{jpg/}}   % 指定不同類型圖片路徑

2.1 格式

插圖的核心命令是 \includegraphics,其語法格式爲:

\includegraphics[<選項>]{<文件名>}

其中,<文件名> 是圖形文件的文件名,一般的擴展名可以省略不寫,LaTeX 會自動查找它支持的文件格式,爲了明確也可以加上擴展名。

2.2 大小、位置

插入的圖形一般都有一個自然比例,對於 EPS、PDF 圖形就是製作的尺寸,對於 JPG、PNG、BMP 等像素圖的尺寸則是點陣數除以圖形打印度(一般用每英寸點數 DPI 表示)。可以給 \includegraphics 命令加一些可選項來調整圖形的大小、位置等:

\includegraphics[width=2em]{picture}    % 寬度
\includegraphics[height=1cm]{picture}   % 高度
\includegraphics[scale=0.5]{picture}    % 縮放比例

2.3 旋轉

使用 angle 選項可以讓圖形逆時針旋轉一定角度,旋轉中心可以用 origin 選項確定。origin 的值可以用字符 l,r,c,t,b,B 中的一個或兩個,分別表示左、右、中、上、下和基線(默認值爲 lb)。

\includegraphics[angle=90]{picture}             % 以左下角爲原點逆時針旋轉 90 度
\includegraphics[angle=-45,origin=c]{picture}   % 以中心點爲原點順時針旋轉 45 度

插入圖形的基線就在圖片的底部,因而圖片盒子的深度爲零。但圖片旋轉時,基線和深度會隨 origin 不同而變化,此時要對圖片進行放縮,就要用 totalheight 代替 height 選項,表示規定圖片深度和高度之和:

\includegraphics[angle=90,origin=b,totalheight=1.5cm]{picture}

2.4 其他

includegraphics 除了以上介紹的參數選項外,還有一些其他的參數選項,諸如:

  • draftfinal:同宏包選項相同,僅針對當前插圖
  • keepaspectratio:布爾值,決定縮放時是否保持圖片原有的長寬比。如果只設置了 widthheighttotalheight 中的一個,則默認爲真。

對於更多的參數選項,可參見 graphicx 宏包官方文檔。

texdoc graphicx

3. 進階

3.1 幾何變換

graphicx/graphics 宏包不僅提供了插圖的功能,也提供了對任意對象(即盒子)進行幾何變換的功能。除了平移,TeX 本身並沒有幾何變換的功能,這些功能同樣是依賴具體的編譯程序。

  • \scalebox 命令用來按比例對內容進行放縮,其語法格式爲:
\scalebox{<水平因子>}[<垂直因子>]{<內容>}   % <垂直因子> 省略時,與 <水平因子> 相同。
  • \reflectbox 命令用來對內容做水平鏡像反射,其語法格式爲:
\reflectbox{<內容>}     % 相當於 \scalebox{-1}[-1]{<內容>}
  • \resizebox 命令用來把內容放縮到指定的寬度和高度,其語法格式爲:
\resizebox{<寬度>}{<高度>}{<內容>}  % <寬度> 和 <高度> 可以使用 ! 表示按比例隨另一個分量放縮
  • \resizebox* 命令和 \resizebox 功能相同,只是第二個參數表示盒子高度和深度之和。

  • \rotatebox 命令用來對內容進行旋轉,其語法格式爲:

\rotatebox[<選項>]{<角度>}{<內容>}  % <選項> 是 graphicx 宏包纔有

\rotatebox 命令在選項中可以使用 origin 選項表示旋轉原點,值與 \includegraphics 中的選項相同,使用 lrctbB 中的一個或兩個;也可以使用 x=2mm,y=5mm 這樣的選項準確指定旋轉原點。此外,還可以使用 units 選項,其表示旋轉的單位,默認值爲 1^\circ,設置 units=6.283185 就相當於使用弧度制。

【注】graphicx 宏包並不提供錯切變換的功能,如有需要,可以使用 PSTrickstikz 等繪圖宏包。

3.2 頁面旋轉

在 LaTeX 中,不僅可以對盒子進行旋轉,也可以對整個頁面的內容進行旋轉。lscape 宏包的 landscape 環境就可以把整個頁面逆時針旋轉 90^\circ

\usepackage{lscape}
% 導言區
% ……
\begin{landscape}
    \subsection{頁面旋轉}
    ……
\end{landscape}

在生成 PDF 文件的情況下,可以使用 pdflscape 宏包代替 lscape 宏包,它可以在旋轉頁面的同時,讓輸出的 PDF 文件的頁面在閱讀器中顯示時同時順時針旋轉 90^\circ

landscape 環境旋轉的頁面不會影響版心外面頁眉頁腳的輸出,它通常用來表示過寬的內容,如大幅的圖片或寬大的表格。不過,landscape 環境會在前後造成額外的分頁,這對於只想單純插入一張圖片的情形往往並不適合。理想的辦法是產生旋轉的浮動環境,可以使用 rotfloat 宏包提供的 sidewapsfigure 來插入浮動的圖形,同時不會影響浮動頁前後的內容。rotfloat 宏包基於 rotating 宏包和 float 宏包,它會將所有浮動環境增加一個 sideways 開頭的旋轉環境(比如表格有 sidewapstable 環境)。

\usepackage{rotfloat}
\begin{sidewaysfigure}[p]
    \centering
    \includegraphics[width=7in]{figure}
    \caption{這是一張旋轉的圖片}
\end{sidewaysfigure}

此外,可以給 rotfloat 宏包加上旋轉方向選項(默認逆時針旋轉):

\usepackage[figureleft]{rotfloat}   % 順時針旋轉
\usepackage[figureright]{rotfloat}  % 逆時針旋轉

3.3 浮動體

詳情參見 LaTeX浮動體

3.4 標題控制

詳情參見 LaTeX標題控制

3.5 並排與子圖

在實際中,經常需要把好幾個圖表並列放在一起輸出。由於 LaTeX 的浮動環境並不對環境內容加以限制,所以可以直接把多個圖表放在一個浮動體裏。又因爲 tabular 環境生成的表格和 \includegraphics 插入的圖形都是一個大盒子,因此可以直接並排放在一起。

\begin{figure}
    \centering
    \caption{並排的圖片}
    \includegraphics{picture1}
    \includegraphics{picture2}
\end{figure}

如果是和一段文字並排放在一起,則可以使用 \parbox 命令或 minipage 環境生成一個子段盒子:

\begin{figure}
    \centering
    \includegraphics{picture}
    \qquad
    \parbox[b]{0.4\textwidth}{這是一段和圖片並排的文字內容。}
    \caption{picture}
\end{figure}

使用並排的圖表或文字時,需要注意其對齊方式。

  • tabular 環境和 \parbox 生成的子段盒子,默認都是在盒子中央對齊,盒子的基準點是中線左端。
  • \includegraphics 插入的圖形其基準點在左下角。

因此上面例子中 \parbox 使用了 b 選項使文字與前面的圖形對齊,即「底部對齊」。如果需要讓插入垂直「居中對齊」,則可以把它放進子段盒子中。對於「頂部對齊」,需要注意的是如果直接把插圖放進 t 選項的子段盒子中,並不能使圖片在頂部對齊,這是因爲 t 選項只能讓第一行按基線對齊;此時可以在盒子中先使用 \vspace{0pt} 增加一個高度爲 0 的空行,然後按這個空行對齊。

\begin{figure}
    \centering
    \parbox[t]{0.4\textwidth}{
        \vspace{0pt}
        \includegraphics{picture}
    }
    \qquad
    \parbox[t]{0.4\textwidth}{
        \vspace{0pt}    
        這是一段和圖片並排的文字內容。
    }
\end{figure}

3.6 文字繞排

對於小幅的圖表,使用繞排的方式可以得到更爲緊湊的頁面,在篇幅緊張或注重行文的場合,效果往往比浮動環境更有吸引力。由於 TeX 固有的限制,文字繞排的效果還無法做到盡善盡美,對繞排圖表的位置、形狀、使用都有一些限制。因此在使用繞排工具時,往往需要仔細的調整,或者另尋它途。

  • 在 TeX 內部,繞排工具都是使用 \parshape 命令的功能配合複雜的盒子操作與計算完成的,這也是爲什麼在列表環境中無法正常使用繞排功能(因爲列表項也是由 \parshape 實現的)。
  • 可以使用 \parshape 命令產生複雜形狀的繞排效果,下面所介紹的 picinparwrapfigfloatflt 宏包都只能產生矩形的空洞,而 shapeparcutwin 宏包則部分實現了複雜繞排的功能。

3.6.1 picinpar 宏包

picinpar 宏包提供了 \figwindow\tabwindow 來實現繞排功能。它們的語法格式如下:

% 下面四個參數都是必選的
\begin{figwindow}[<下降行數>,<水平位置>,<圖內容>,<圖標題>]
    <繞排文字>
\end{figwindow}
\begin{tabwindow}[<下降行數>,<水平位置>,<表內容>,<表標題>]
    <繞排文字>
\end{tabwindow}

figwindowtabwindow 環境會在 <繞排文字> 的段落中開一個窗口,用來放置圖表。圖表的位置由前兩個參數確定,<下降行數> 是一個整數,確定被繞排圖表的垂直位置,圖表將在這麼多行文字下方顯示;<水平位置> 可以是 l,c,r,表示窗口開在段落左、中、右的位置。後面兩個參數分別是圖表的內容和標題。標題可以留空,但需要保留標題前的逗號,此時就沒有標題和編號。如果標題的編號需要引用,可以把標籤放在標題內。

% 導言區
\usepackage{picinpar}
% ……
\begin{figwindow}[2,c,\includegraphics{picture},picture\label{fig:picture}]
\lipsum*[1]     % 該命令產生足夠長的虛擬文本段落,需要使用 lipsum 宏包

picinpar 能夠自動計算圖表內容的大小,在環境中文本段落指定的位置開窗口放置此圖表。不過,picinpar 也有一個缺點,即它要求環境中的段落在頁面上必須有足夠的空白,如果段落文字恰好在一頁的末尾,就會在頁面上留下大片的空白,這與使用 float 提供的不浮動的圖表環境(H 選項)是一樣的。此外,picinpar 在圖表外面加的間距很小,不方便調整,figwindowtabwindow 環境的語法也與一般的 LaTeX 環境不同。當圖形大小或環境中文本內容在頁面中位置不合適時,picinpar 偶爾還會造成錯誤的段落形狀,需要在使用中小心調整。

3.6.2 wrapfig 宏包

wrapfig 宏包提供了 wrapfigurewraptable 環境,在語法格式上更接近標準的 figuretable 環境:

% 中括號參數是可選的
\begin{wrapfigure}[<行數>]{<位置>}[<外伸長度>]{<寬度>}
    <圖內容>
\end{wrapfigure}
\begin{wraptable}[<行數>]{<位置>}[<外伸長度>]{<寬度>}
    <表內容>
\end{wraptable}

在使用時,<圖內容><表內容> 與普通 figuretable 環境的內容相同,可以是任意代碼產生的圖表,也可以使用 \caption 命令生成標題。在環境後面的段落內容江輝沿圖表繞排。在這裏,<位置> 參數不區分大小寫,可以是 l,r,即左右兩側;也可以用 o,i,表示雙頁頁面的裝訂內側和外側。<寬度> 則指定圖表環境所佔用的寬度。可選的 <行數> 可以指定圖表佔用的行數,如果留空則會按照內容高度自動計算(不過自動計算的結果有時偏大)。<外伸長度> 如果大於 0 pt,則圖表會向左右側面伸出版心指定的長度,產生特殊的效果。

% 導言區
\usepackage{wrapfig}
% ……
\begin{wraptable}[4]{r}[1.5cm]{4.5cm}
    \centering
    \caption{向右伸出的繞排表格}\label{tag:wraptable}
    \begin{tabular}{|c|c|c|c|}
        \hline
        甲 & 乙 & 丙 & 丁 \\
        \hline
    \end{tabular}
\end{wraptable}

wrapfig 在使用時可以不必指定把多少文字包含進繞排的範圍,但它同樣也有與 picinpar 類似的問題,即本頁中剩下的空間必須足夠放下被繞排的圖表,否則也將造成難看的分頁。在功能上,wrapfig 可以讓圖伸出版心之外,不過不能把圖表放在中間或跳過前幾行,因而與 picinpar 有互補的效果。

3.6.3 floatflt 宏包

floatflt 宏包與 wrapfig 類似,它提供了 floatingfigurefloatingtable 的浮動環境,可以把浮動體放在一段開頭的左側或右側。floatflt 的獨特功能是提供了 \fltitem 命令,試圖解決與列表環境共用時產生的問題。

3.6.4 shapepar 宏包

shapepar 宏包的 \cutout 命令部分實現了複雜形狀繞排功能,其基本語法格式爲:

\cutout{<side>}(<h_offset>,<v_offset>)<settings> \shapepar <文字內容>

其中,必選的 <side> 參數只能爲 l,r。圖表的默認的位置爲盒子的中心位置,可選的 <h_offset><v_offset> 分別表示圖表由默認位置上在水平、垂直方向上的偏移,正值分別表示往右、下偏移,負值分別表示往左、上。

shapepar 宏包提供了許多預定義的繞排形狀,詳細參見官方文檔:

texdoc shapepar

3.6.5 cutwin 宏包

cutwin 宏包也提供了類似 picinparwrapfig 的繞排功能,同時與 shapepar 一樣還支持自定義挖洞的形狀。雖然沒有 shaperpar 一樣豐富的預定義形狀,不過在處理繞排時其語法相對自然。cutwinshapepar 宏包有命名衝突,具體用法參見官方文檔:

texdoc cutwin
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章