LaTeX中插入图片

在科研论文中,图片是一个非常重要的组成部分。LaTeX 提供了许多定制化图片的功能。这篇文章将会介绍如何用最常见的格式插入图片、缩放图片、旋转图片,以及如何在文档中引用这些图片。实现插入图片的功能需要在导言引用graphicsgraphicx, 下面就一些重要的点展开讨论。

图片的路径

当你的文档拥有很多个图片的时候,创建多个文件夹来存储图片是一个规划项目的好办法。

命令\graphicspath{ {images/} }告诉 LaTeX 在_images_文件夹中寻找图片。这个路径是当前工作文件夹的相对路径,所以,编译器会在当前文档所在的目录中开始寻找文件。文件夹的路径默认情况下是相对路径,如果没有一个初始的目录被指定,例如:

1
2
%Path relative to the .tex file containing the \includegraphics command
\graphicspath{ {images/} }

这是一个非常直接的方法来指定图片所存储的路径,不过有时候会使情况变得复杂,从而导致编译器找不到图片所在的目录。所以,你最好手动指定一个对于主 .tex 文件来说相对的图片路径,将主 .tex 文件夹表示为 ./,例如:

1
2
%Path relative to the main .tex file 
\graphicspath{ {./images/} }

路径也可以是绝对路径。例如,如果你在一个本地 LaTeX 环境中进行工作,你可以:

1
2
3
4
5
%Path in Windows format:
\graphicspath{ {c:/user/images/} }

%Path in Unix-like (Linux, Mac OS) format
\graphicspath{ {/home/user/images/} }

需要注意的是,目录的结尾也需要一个斜杠,并且路径是被包含在双大括号之间。

你还可以设置多个路径,如果文档的图片被存储在多个文件夹中。例如,如果有两个文件夹_images1_和_images2_,使用下面的命令:

1
\graphicspath{ {./images1/}{./images2/} }

改变图片的大小、旋转图片

如果我们想额外地编辑图片的属性(长、宽等),我们可以使用下面的设定:

1
2
3
4
5
6
7
\begin{document}

Overleaf is a great professional tool to edit online,
share and backup your \LaTeX{} projects. Also offers a
rather large help documentation.

\includegraphics[scale=1.5]{lion-logo}

命令\includegraphics[scale=1.5]{lion-logo}会把图片 lion-logo 插入到文档中,额外的参数scale=1.5会把图片的大小变为原本的1.5倍。你也可以指定图片的长宽:

1
2
3
4
5
6
7
\begin{document}

Overleaf is a great professional tool to edit online,
share and backup your \LaTeX{} projects. Also offers a
rather large help documentation.

\includegraphics[width=3cm, height=4cm]{lion-logo}

如聪明的你所想的,方括号里的参数[width=3cm, height=4cm]定义了图片的宽度和高度。你还可以使用不同的单位来定义这些参数。如果只有宽度_width_被指定了,那么高度会被自动调整到图片原始的比例。

长度单位也可以被设置为文档中某些属性的相对值。例如,你可以将图片的宽度设置为文档中一行文本所占的宽度:

1
2
3
4
5
6
\begin{document}

The universe is immense and it seems to be homogeneous,
in a large scale, everywhere we look at.

\includegraphics[width=\textwidth]{universe}

除了\textwidth,你还可以使用其他的 LaTeX 默认长度,例如\columnseplinewidth\textheight\paperheight等。更多有关单位的信息请见这篇文章

LaTeX 中还有一种常见的改变图片的方法,即旋转图片:

1
2
3
4
5
6
7
\begin{document}

Overleaf is a great professional tool to edit online,
share and backup your \LaTeX{} projects. Also offers a
rather large help documentation.

\includegraphics[scale=1.2, angle=45]{lion-logo}

参数angle=45会将图片逆时针旋转45度。顺时针旋转的话你可以使用负数。

图片的位置

在上一个章节中,我们介绍了如何在文档中插入图片,但是文字和图片的结合可能并不是我们想要的样子。所以我们接下来介绍一种新的环境。

1
2
3
4
5
6
In the next example the figure will be positioned 
right below this sentence.

\begin{figure}[h]
\includegraphics[width=8cm]{Plot}
\end{figure}

figure环境的作用是在文档中将图片展示为浮动元素。这意味着你可以把图片放置在figure环境之中,不需要再去关注图片的位置,LaTeX 会自动把图片放置在文档中的合适位置。

当然,有些时候我们需要更细致地控制图片的位置。我们可以使用一种额外的参数来控制图片的位置。在这个例子中,begin{figure}[h],方括号中的参数h意味着 here。下面的表格中列出了参数的可选值。

参数 位置
h 将浮动元素的位置设定为 here(这里),也就是说,大约_位于其在文档中出现位置(是_大约,而不是完全精确)
t 将浮动元素的位置设定为页面的上方(top)
b 将浮动元素的位置设定为页面的底部(bottom)
p 将浮动元素仅放置在一个特殊的页面
! 重新设置LaTeX的一个内部参数,这个参数决定了LaTeX如何判断一个浮动元素的位置够不够“好”
H 将浮动元素精确地放置在它在文本中所出现的位置。这个参数需要引入float包,它有可能会造成一些错误。这个参数有时候等价于h!

在下面的例子中,你可以看到,尽管图片定义在文字之后,但是图片依旧出现在了页面的顶部。

1
2
3
4
5
6
7
8
In this picture you can see a bar graph that shows
the results of a survey which involved some important
data studied as time passed.

\begin{figure}[t]
\includegraphics[width=8cm]{Plot}
\centering
\end{figure}

命令\centering会将图片居中显示。默认的对齐选项是向左对齐。

图题、标签、引用

给图片添加标题和标签是两个非常重要的工具。

图题

让我们从一个例子开始。

1
2
3
4
5
\begin{figure}[h]
\caption{Example of a parametric plot ($\sin (x), \cos(x), x$)}
\centering
\includegraphics[width=0.5\textwidth]{spiral}
\end{figure}

非常简单,对吧?只需要添加\caption{Some caption}命令,在大括号内输入你要添加的文字就可以了。命令的位置决定着图题会出现在图片的上方或者下方。

图题也可以放置在图片的侧方。引入sidecap包即可。

1
2
3
4
5
6
7
8
9
10
\usepackage[rightcaption]{sidecap}

\usepackage{graphicx} %package to manage images
\graphicspath{ {images/} }

\begin{SCfigure}[0.5][h]
\caption{Using again the picture of the universe.
This caption will be on the right}
\includegraphics[width=0.6\textwidth]{universe}
\end{SCfigure}

它有两个新的命令。

\usepackage[rightcaption]{sidecap}
如你所想,这个命令会引入sidecap包,并且方括号中的参数会将文档中的图片的图题设置在图片的右方。你也可以使用leftcaption参数。对于book类型的文档,你还可以使用outercaption或者innercaption

\begin{SCfigure}[0.5][h] \end{SCfigure}
这个命令定义了一个类似于figure的环境。第一个参数定义了图题相对于图片的宽度。第二个参数hfigure环境中的h作用相同。

LaTeX中还有更多的命令来对图片进行定制化,你可以在本文的末尾找到更多信息。

标签和交叉引用

与LaTeX文档中的许多其他元素相同(例如公式、表格等),图片也可以在文本中被引用。你只需要简单地对其添加一个标签就可以了,然后使用这个标签来在文本中引用这个图片。

1
2
3
4
5
6
7
8
9
10
\begin{figure}[h]
\centering
\includegraphics[width=0.25\textwidth]{mesh}
\caption{a nice plot}
\label{fig:mesh1}
\end{figure}

As you can see in the figure \ref{fig:mesh1}, the
function grows near 0. Also, in the page \pageref{fig:mesh1}
is the same example.

下面我们介绍三种生成交叉引用的命令。

  • \label{fig:mesh1}
    这个命令设置了图片的标签。对标签添加一个前缀是一个很好的习惯,例如对图片添加fig,对表格添加tab等。

  • \ref{fig:mesh1}
    这个命令在文本中添加一个数字,数字对应着这个图片。这个数字会自动生成,并且当你插入其他图片的时候,它会自动更新。

  • \pageref{fig:mesh1}
    这个命令会输出图片所在的页数。

如果你想要引用一个图片,那么\caption命令是强制的。

LaTeX 另外一个强大的功能是,你可以自动生成文档中图片的列表:

1
\listoffigures

这个命令仅对有标签的图片有效。重要提示:你必须编译LaTeX文档两次来使交叉引用等功能正常显示。

生成高分辨率的和低分辨率的图片

我们在\includegraphics命令中输入图片的文件名的时候,我们忽略了图片文件的后缀。事实上,添加后缀并不是强制的,尽管很多时候添加后缀是很有用的。如果文件名的后缀没有被输入,那么LaTeX会在当前文件夹中自动搜索所有支持的文件格式,并且会用默认的顺序来搜索各种后缀(这个顺序可以自定义)。

如果你需要经常在开发模式和生产模式之间切换,那么这个功能会很有用。在开发模式中(当文档还没有完成的时候),你可能想去使用低分辨率的图片(一般来说是png格式的)来加速编译。在生产模式中(生成文档的最终版本),你可能想要使用高分辨率的图片。

你可以这样做:

  • 不要在\includegraphics命令中输入文件名的后缀
  • 在文档的序言中设定你想要的后缀

这样,我们可以在图片的两种格式之间灵活切换,例如venndiagram.pdf(高分辨率)和venndiagram.png(低分辨率)。然后我们可以在序言中使用下面的命令:

1
\DeclareGraphicsExtensions{.png,.pdf}

上面的命令的作用是,如果在同一位置中,两个拥有相同文件名,但是后缀不同的文件(例如venndiagram.pdfvenndiagram.png),那么位置在前的版本将会被使用(这个例子中的png)。如果没有png文件,那么pdf文件会被使用。

当文档完成之后,为了使用高分辨率的pdf图片,我们可以更换后缀的顺序:

1
\DeclareGraphicsExtensions{.pdf,.png}

如果pdf图片还没有转换为png格式,我们可以在LaTeX中直接生成低分辨率的png图片。我们首先在序言中引入下面的命令(在\usepackage{graphicx}命令之后):

1
2
3
\usepackage{epstopdf}
\epstopdfDeclareGraphicsRule{.pdf}{png}{.png}{convert #1 \OutputFile}
\DeclareGraphicsExtensions{.png,.pdf}

如果venndiagram2.pdf存在,但是venndiagram2.png不存在,那么venndiagram2-pdf-converted-to.png文件将会被创建。命令convert #1用来执行转换操作,你也可以对它添加额外的参数,例如convert -density 100 #1

这里还有一些重要的事情需要注意:

  • 为了让自动转换正常工作,我们在执行pdflatex命令的时候,需要添加--shell-escape参数
  • 对于最终的_生产_版本,我们必须把\epstopdfDeclareGraphicsRule命令注释掉。这样只有高分辨率的图片会被加载。我们还需要改变顺序的优先级。

参考指南

LaTeX 单位和长度

缩写 定义
pt 一个点,默认的长度单位。大约相当于0.3515mm
mm 毫米
cm 厘米
in 英寸
ex 在当前字体大小的情况下字母x的高度
em 在当前字体大小的情况下字母m的宽度
\columnsep 列之间的距离
\columnwidth 列的宽度
\linewidth 当前环境下行的宽度
\paperwidth 页面的宽度
\paperheight 页面的高
\textwidth 文本的宽度
\textheight 文本的高度
\unitlength picture环境下units的长度

LaTeX中图片的类型

latex
如果你使用latex来编译,我们只可以使用EPS格式的图片,这种格式是矢量格式。

pdflatex
如果你使用pdflatex来生成pdf文档,我们可以使用下面格式的图片:

1
2
3
4
5
JPG: Best choice if we want to insert photos
PNG: Best choice if we want to insert diagrams (if a vector version could not be generated) and screenshots
PDF: Even though we are used to seeing PDF documents, a PDF can also store images
EPS: EPS images can be included using the epstopdf package (we just need to install the package, we
don't need to use \usepackage{} to include it in our document.)

矢量图片或者位图?

图片可以是矢量的,或者是位图(bit-map)。一般来说,我们并不需要关心图片的格式。不过如果我们知道图片格式之间的差异,我们就可以选择一种合适的图片格式来使用。如果我们的图片是矢量的,那么它应该是PDF或者EPS。如果我们的图片是位图,那么它应该是JPG或者PNG。在PDF或者EPS中存储bit-map会消耗大量的存储空间。

引用说明

参考:在LaTeX中插入图片