大家好,又见面了,我是你们的朋友全栈君。
原 文:Inserting Images 译 者:Xovee 翻译时间:2020年9月18日
在 LaTeX 中插入图片
在科研论文中,图片是一个非常重要的组成部分。LaTeX 提供了许多定制化图片的功能。这篇文章将会介绍如何用最常见的格式插入图片、缩放图片、旋转图片,以及如何在文档中引用这些图片。
文章目录
- 在 LaTeX 中插入图片
- 介绍
- 图片的路径
- 改变图片的大小、旋转图片
- 图片的位置
- 图题、标签、引用
- 图题
- 标签和交叉引用
- 生成高分辨率的和低分辨率的图片
- 参考指南
- 延伸阅读
介绍
下面是一个插入图片的例子:
代码语言:javascript复制documentclass{article}
usepackage{graphicx}
graphicspath{ {./images/} }
begin{document}
The universe is immense and it seems to be homogeneous,
in a large scale, everywhere we look at.
includegraphics{universe}
There's a picture of a galaxy above
end{document}
LaTeX 本身不能处理图片,所以我们需要引入graphicx
包:在文档的序言部分使用如下命令:
usepackage{graphicx}
命令graphicspath{ {./images/} }
告诉 LaTeX 这篇文档中的图片所存储的位置是主文档所在目录下的 images 文件夹。
而includegraphics{universe}
是真正插入图片的那个命令。universe 是图片文件的名字(没有后缀),也就是说:universe.PNG变成了universe。图片文件的名字一般来说不能包含空格或者多个句号。
注意:*使用文件后缀是被允许的,不过我们推荐你忽略文件的后缀。如果 LaTeX 没有找到文件的指定的后缀,它会在目录中搜索拥有该文件名的所有格式兼容的文件。更多有关的信息请见:生成高分辨率和低分辨率的图片。
在 Overleaf 中打开这个例子
图片的路径
当你的文档拥有很多个图片的时候,创建多个文件夹来存储图片是一个规划项目的好办法。
命令graphicspath{ {images/} }
告诉 LaTeX 在images文件夹中寻找图片。这个路径是当前工作文件夹的相对路径,所以,编译器会在当前文档所在的目录中开始寻找文件。文件夹的路径默认情况下是相对路径,如果没有一个初始的目录被指定,例如:
%Path relative to the .tex file containing the includegraphics command
graphicspath{ {images/} }
这是一个非常直接的方法来指定图片所存储的路径,不过有时候会使情况变得复杂,从而导致编译器找不到图片所在的目录。所以,你最好手动指定一个对于主 .tex 文件来说相对的图片路径,将主 .tex 文件夹表示为 ./,例如:
代码语言:javascript复制%Path relative to the main .tex file
graphicspath{ {./images/} }
路径也可以是绝对路径。例如,如果你在一个本地 LaTeX 环境中进行工作,你可以:
代码语言:javascript复制%Path in Windows format:
graphicspath{ {c:/user/images/} }
%Path in Unix-like (Linux, Mac OS) format
graphicspath{ {/home/user/images/} }
需要注意的是,目录的结尾也需要一个斜杠,并且路径是被包含在双大括号之间。
你还可以设置多个路径,如果文档的图片被存储在多个文件夹中。例如,如果有两个文件夹images1和images2,使用下面的命令:
代码语言:javascript复制graphicspath{ {./images1/}{./images2/} }
在 Overleaf 中打开这个例子
改变图片的大小、旋转图片
如果我们想额外地编辑图片的属性(长、宽等),我们可以使用下面的设定:
代码语言:javascript复制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倍。
你也可以指定图片的长宽:
代码语言:javascript复制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被指定了,那么高度会被自动调整到图片原始的比例。
长度单位也可以被设置为文档中某些属性的相对值。例如,你可以将图片的宽度设置为文档中一行文本所占的宽度:
代码语言:javascript复制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 默认长度,例如columnsep
、linewidth
、textheight
、paperheight
等。更多有关单位的信息请见这篇文章。
LaTeX 中还有一种常见的改变图片的方法,即旋转图片:
代码语言:javascript复制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度。顺时针旋转的话你可以使用负数。
在Overleaf中打开这个例子
图片的位置
在上一个章节中,我们介绍了如何在文档中插入图片,但是文字和图片的结合可能并不是我们想要的样子。所以我们接下来介绍一种新的环境。
代码语言:javascript复制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! |
在下面的例子中,你可以看到,尽管图片定义在文字之后,但是图片依旧出现在了页面的顶部。
代码语言:javascript复制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
会将图片居中显示。默认的对齐选项是向左对齐。
你也可以将文字环绕在图片的周围。如果文档包含一些小的图片,这样做看起来会更好一些。
代码语言:javascript复制begin{wrapfigure}{r}{0.25textwidth} %this figure will be at the right
centering
includegraphics[width=0.25textwidth]{mesh}
end{wrapfigure}
There are several ways to plot a function of two variables,
depending on the information you are interested in. For
instance, if you want to see the mesh of a function so it
easier to see the derivative you can use a plot like the
one on the left.
begin{wrapfigure}{l}{0.25textwidth}
centering
includegraphics[width=0.25textwidth]{contour}
end{wrapfigure}
On the other side, if you are only interested on
certain values you can use the contour plot, you
can use the contour plot, you can use the contour
plot, you can use the contour plot, you can use
the contour plot, you can use the contour plot,
you can use the contour plot, like the one on the left.
On the other side, if you are only interested on
certain values you can use the contour plot, you
can use the contour plot, you can use the contour
plot, you can use the contour plot, you can use the
contour plot, you can use the contour plot,
you can use the contour plot,
like the one on the left.
为了做到上面的效果,你需要引入wrapfig包。在文档的序言中引入它:
代码语言:javascript复制usepackage{wrapfig}
现在你可以定义wrapfigure
环境:
begin{wrapfigure}{l}{0.25textwidth}
...
end{wrapfigure}
需要注意的是,这个环境拥有两个额外的参数。
{l}
这个参数定义了图片的对齐方式。l
是左边,r
是右边。如果你的文档是book
或者其他类似的格式,o
代表着页面的外边界,i
代表着页面的内边界。
{0.25textwidth}
这个参数定义了图片元素的宽度。这个不是图片本身的宽度,图片本身的宽度必须使用includegraphics
命令。需要注意的是,这个宽度是文本宽度的相对大小,你也可以使用其他常规的距离(cm, in, mm 等)。更多距离单位请见这篇文章。
centering 我们前面已经介绍过这个参数了。但是在这个环境里,图片的居中位置是相对于它的容器,而不是页面的文本。
这篇文章更详细地介绍了图片和表格的位置。
在Overleaf中打开这个例子
图题、标签、引用
给图片添加标题和标签是两个非常重要的工具。
图题
让我们从一个例子开始。
代码语言:javascript复制begin{figure}[h]
caption{Example of a parametric plot ($sin (x), cos(x), x$)}
centering
includegraphics[width=0.5textwidth]{spiral}
end{figure}
非常简单,对吧?只需要添加caption{Some caption}
命令,在大括号内输入你要添加的文字就可以了。命令的位置决定着图题会出现在图片的上方或者下方。
图题也可以放置在图片的侧方。引入sidecap
包即可。
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.6textwidth]{universe}
end{SCfigure}
它有两个新的命令。
usepackage[rightcaption]{sidecap}
如你所想,这个命令会引入sidecap
包,并且方括号中的参数会将文档中的图片的图题设置在图片的右方。你也可以使用leftcaption
参数。对于book
类型的文档,你还可以使用outercaption
或者innercaption
。
begin{SCfigure}[0.5][h] end{SCfigure}
这个命令定义了一个类似于figure
的环境。第一个参数定义了图题相对于图片的宽度。第二个参数h
与figure
环境中的h
作用相同。
LaTeX中还有更多的命令来对图片进行定制化,你可以在本文的末尾找到更多信息。
标签和交叉引用
与LaTeX文档中的许多其他元素相同(例如公式、表格等),图片也可以在文本中被引用。你只需要简单地对其添加一个标签就可以了,然后使用这个标签来在文本中引用这个图片。
代码语言:javascript复制begin{figure}[h]
centering
includegraphics[width=0.25textwidth]{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 另外一个强大的功能是,你可以自动生成文档中图片的列表:
代码语言:javascript复制listoffigures
这个命令仅对有标签的图片有效。
重要提示:你必须编译LaTeX文档两次来使交叉引用等功能正常显示。
在Overleaf中打开这个例子
生成高分辨率的和低分辨率的图片
我们在includegraphics
命令中输入图片的文件名的时候,我们忽略了图片文件的后缀。事实上,添加后缀并不是强制的,尽管很多时候添加后缀是很有用的。如果文件名的后缀没有被输入,那么LaTeX会在当前文件夹中自动搜索所有支持的文件格式,并且会用默认的顺序来搜索各种后缀(这个顺序可以自定义)。
如果你需要经常在开发模式和生产模式之间切换,那么这个功能会很有用。在开发模式中(当文档还没有完成的时候),你可能想去使用低分辨率的图片(一般来说是png格式的)来加速编译。在生产模式中(生成文档的最终版本),你可能想要使用高分辨率的图片。
你可以这样做:
- 不要在
includegraphics
命令中输入文件名的后缀 - 在文档的序言中设定你想要的后缀
这样,我们可以在图片的两种格式之间灵活切换,例如venndiagram.pdf
(高分辨率)和venndiagram.png
(低分辨率)。然后我们可以在序言中使用下面的命令:
DeclareGraphicsExtensions{.png,.pdf}
上面的命令的作用是,如果在同一位置中,两个拥有相同文件名,但是后缀不同的文件(例如venndiagram.pdf
和venndiagram.png
),那么位置在前的版本将会被使用(这个例子中的png)。如果没有png文件,那么pdf文件会被使用。
当文档完成之后,为了使用高分辨率的pdf图片,我们可以更换后缀的顺序:
代码语言:javascript复制DeclareGraphicsExtensions{.pdf,.png}
如果pdf图片还没有转换为png格式,我们可以在LaTeX中直接生成低分辨率的png图片。我们首先在序言中引入下面的命令(在usepackage{graphicx}
命令之后):
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
命令注释掉。这样只有高分辨率的图片会被加载。我们还需要改变顺序的优先级。
在Overleaf中打开这个例子
参考指南
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文档,我们可以使用下面格式的图片:
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会消耗大量的存储空间。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135388.html原文链接:https://javaforall.cn