LaTeX Beamer数理报告中的常用元素

序言

说起演示文稿,大家最熟悉的是微软Power Point。相信大部分读者都曾见过或者制作过精美的PPT演示文稿,其中包含大量的图示和动画,甚至声音等多媒体效果。Power Point绝对是最强大最流行的演示文稿制作软件,可以满足几乎所有的展示需求。然而,正如微软Office其他软件在数学公式编辑上的短板一样,Power Point对数理公式的支持虽然近年来进步迅速,但是仍然不能令人满意。在处理、显示大量公式的时候,Power Point效率非常低,而且公式的编辑也常常会产生莫名其妙的错误,在其自由度上也有所限制。每每在这个时候,就会让人想起$\LaTeX$。

数学物理文档排版是$\LaTeX$的当家本领。除了在公式排版上独一无二的优势,$\LaTeX$的各种模板和宏包使得熟悉这套编译系统的用户如鱼得水。相信经常使用$\LaTeX$的学生或者研究人员都产生过使用$\LaTeX$搞定一切文档的想法,特别是在制作演示文稿的时候。

$\LaTeX$ Beamer是使用$\LaTeX$制作演示文稿的绝好的工具。制作精美的Beamer可以用在学术报告、讨论会以及课堂教学等场合。然而,与PPT的容易上手相比,Beamer似乎难度大了一点。即使对于有过使用$\LaTeX$编写数理文档经历的读者来讲,Beamer或许完全是另外一套体系。虽然网络上有Beamer自己的文档以及各种简易的教程,想要参考这些资料制作可以与PPT的产品水平相当的演示文稿仍然难度太大;而参考Beamer文档对于一个初学者来说非常枯燥——对于我来说是这样的。因此,一本完整的Beamer入门和提高的教程是非常有必要的。

本教程默认读者具有入门级别的$\LaTeX$知识——只要读者知道通常的$\LaTeX$源文件是什么样子、如何编译即可。本教程内容尽可能自洽,对于超出本书范围的内容会给出易读的参考资料。

本教程使用Beamer 3.0版本,用户手册参见英文版中文版。在此向维护者、手册作者及译者致谢。

配置与运行

在Linux环境下可以通过安装texlive-full直接安装包括Beamer的整套$\LaTeX$编译工具,例如在Ubuntu下:

1
$ sudo apt install texlive-full

安装成功之后,即可通过pdflatex命令编译tex文件生成pdf文件:

1
$ pdflatex sample.tex

对于包含中文的tex文件,通常应当使用xelatex命令编译生成pdf文件

1
$ xelatex sample.tex

本文所有tex代码均由xelatex编译。
一些现成的Beamer示例通常放置于/usr/share/texlive/texmf-dist/doc/latex/beamer/solutions目录中。新手可以从阅读并修改示例开始。
在Windows环境下,推荐在安装TeXLive后,使用专门的IDE,例如TeXstudio等。

Beamer源文件框架

一个Beamer源文件是以.tex为后缀的UTF8格式的纯文本文档。对于中文Beamer,一个Beamer必备的框架为

1
2
3
4
5
6
7
8
\documentclass{beamer}  
\usepackage[english]{babel}
%\usepackage{ctex} %使用中文时应当取消本行注释并使用xelatex编译
%导入宏包和配置
%文档基本参数
\begin{document}
%正文
\end{document}

一个最简单示例

读者当然可以从beamer/solution目录下的示例开始创建自己的文档。这里给出一个最简单示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
\documentclass{beamer}
\usepackage[english]{babel}

\title{There Is No Largest Prime Number}
\author{Euclid of Alexandria}
\date{27th International Symposium of Prime Numbers}

\begin{document}
\begin{frame} %一帧的开始
\titlepage %自动生成首页
\end{frame} %一帧的结束
\begin{frame}
\tableofcontents %有目录时需要编译两次
\end{frame}
\section{Section 1} %只作为目录的划分在目录中显示,不在正文中显示。
\begin{frame} %一帧正文示例,内容的语法与普通tex文档基本相同。
\frametitle{There Is No Largest Prime Number}
\framesubtitle{The proof uses \textit{reductio ad absurdum}.}
There is no largest prime number.
\begin{theorem}
There is no largest prime number.
\end{theorem}
\begin{proof}
\begin{enumerate}
\item Suppose $p$ were the largest prime number.
\item Let $q$ be the product of the first $p$ numbers.
\item Then $q+1$ is not divisible by any of them.
\item But $q + 1$ is greater than $1$, thus divisible by some prime
number not in the first $p$ numbers.\qedhere
\end{enumerate}
\end{proof}
\end{frame}
\end{document}

这个演示文稿没有使用主题,也没有使用叠层(即单击后显示的元素),也没有图片等等。下面我们讲解最实用的一些操作,使Beamer制作的演示文稿华丽升级。

我们希望能够像使用PPT一样使用Beamer。首先就是要能够自由添加文字、图片、表格等必需基本元素,也就是说要自由编辑其位置、尺寸、旋转等等属性。

定位框:textpos宏包

导入textpos宏包即可自由安排文字位置:

1
2
3
4
%通常
\usepackage[absolute,overlay]{textpos}
%显示定位框边框,通常在调试中使用
\usepackage[absolute,overlay,showboxes]{textpos}

直接调用方法:textblock*环境

1
2
3
\begin{textblock*}{width}(x,y) %width为定位框宽度,x、y为定位框左上角坐标。
whatever you want to put here
\end{textblock*}

1
2
3
\begin{textblock*}{width}[0.5,0.5](x,y) %width为定位框宽度,x、y为定位框中心点坐标
whatever you want to put here
\end{textblock*}

这里宽度和坐标需要是长度量

长度量

即带长度单位的数,如:20pt,1.5em,3cm,200mm等,通常用在设置元素的尺寸和位置的地方。所有使用长度量的参数都可以使用长度宏,并且无需额外导入宏包。Beamer中常用的长度宏有

  • \paperwidth 页面长度
  • \paperheight 页面高度

可以直接对长度宏使用乘法,如0.5/paperwidth。 如果使用更多的算术如加减,需要导入calc宏包
undefined

则加法可以写成0.5/paperwidth+3cm
关于长度量,参见LaTeX/Lengths


预设长度单位调用方法:textblock环境
需要在导言区(即\begin{document}之前)预设参数:
1
2
3
\setlength{\TPHorizModule}{width_unit}  %width_unit是长度量,为textblock的宽度和横坐标的单位
\setlength{\TPVertModule}{height_unit} %height_unit是长度量,为textblock的高度和纵坐标的单位
\setlength{\parindent}{0pt} %textblock中内容的缩进量,通常直接设成0pt

调用与上面类似:

1
2
3
\begin{textblock}{width}[0.5,0.5](x,y) %width为定位框宽度,x、y为定位框中心点坐标
whatever you want to put here
\end{textblock}

此时宽度和坐标只需要写一个纯数字就可以了,单位是导言区预设的。

直接调用和单数预设单位调用可以混合使用。

当定位框宽度小于文字总长度时,文字会换行;当定位框宽度小于一个英文单词时,英文单词会断开。
定位框使得任意安排文字、图片等内容的位置,也可以设置底色。但是,并不建议将定位框当做文本框使用,因为定位框给出的样式并不美观。所以定位框最好只用作定位。

以下是示例。

按照文字中心点设置文字位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
\documentclass{beamer}
\usepackage[english]{babel}
\usepackage[absolute,overlay]{textpos}

\setlength{\TPHorizModule}{\paperwidth} %设置textpos横向单位为页面宽度
\setlength{\TPVertModule}{\paperheight} %设置textpos纵向单位为页面高度
\setlength{\parindent}{0pt} %设置textpos内容无缩进

\begin{document}
\begin{frame}
\begin{textblock}{.7}[0.5,0.5](.5,.7) %定位框宽度为0.7,定位框中心在页面(0.5,0.7)处
\centering %定位框文字内容居中
A quick brown fox jumps over a lazy dog. %内容,可以为文字、图片、表格等等任意元素
\end{textblock}
\end{frame}
\end{document}

将itemize一类的列表居中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
\documentclass{beamer}
\usepackage[english]{babel}
\usepackage[absolute,overlay,showboxes]{textpos}

\setlength{\TPHorizModule}{\paperwidth}
\setlength{\TPVertModule}{\paperheight}
\setlength{\parindent}{0pt}

\begin{document}
\begin{frame}
\begin{textblock}{.6}[0.5,0.5](.5,.7)
%\centering和\begin{center}\end{center}对列表无效
%只能调节textblock的width使得刚好装得下列表
%这里手动设置为0.6(即0.6\paperwidth)达到预期效果
\begin{itemize}
\item A quick brown fox jumps over a lazy dog.
\item A quick brown fox.
\item Quick.
\end{itemize}
\end{textblock}
\end{frame}
\end{document}

文本框

文本框是PPT里最常用的元素。在Beamer里同样可以使用。

Block框

有些主题自带显示效果不错的block框,包含三种颜色风格block(蓝色)、exampleblock(绿色)和alertblock(红色)使用方法如下

1
2
3
4
5
6
7
8
9
\begin{block}{block title}
Normal information.
\end{block}
\begin{exampleblock}{exampleblock title}
Example information.
\end{exampleblock}
\begin{alertblock}{alertblock title}
Alert information.
\end{alertblock}

也可以配合定位框使用:

1
2
3
4
5
\begin{textblock}{0.5}[.5,.5](.5,.3)
\begin{alertblock}{alertblock title}
Alert information.
\end{alertblock}
\end{textblock}

fbox和fancybox

$\LaTeX$自带\fbox{text}可以绘制简单的矩形文本外框

\fbox与textblock组合
1
2
3
4
\begin{textblock}{.6}[0.5,0.5](.5,.3)
\center
\fbox{Here is my text}
\end{textblock}

其边距和边框粗细可以在导言区设置,例如:

1
2
\setlength{\fboxsep}{10pt}  %设置边距
\setlength{\fboxrule}{5pt} %设置边框粗细

其边框颜色可以使用\color设置,可以导入xcolor宏包方便使用颜色:

1
2
3
4
5
6
\begin{textblock}{.6}[0.5,0.5](.5,.3)
\center
1kjaioshd9 {\color{red}\fbox{\color{black}caiskjcoa}} qwijdqio
%括号{}保证颜色设置不会影响其他文字
%若只修改外框颜色,需要将框内文字的颜色调回来
\end{textblock}

或者直接自定义宏:

1
2
3
4
5
6
7
8
%导言区
\newcommand{\cfbox}[2]{%
\colorlet{currentcolor}{.}%
{\color{#1}%
\fbox{\color{currentcolor}#2}}%
}
%调用
\cfbox{red}{In red box} Normal black text

此外,fancybox宏包提供了三种基本的文本框格式:\doublebox \ovalbox \shadowbox

多行文本的特殊处理
1
2
3
4
5
6
7
8
9
\documentclass{beamer}
\usepackage[english]{babel}
\usepackage{fancybox,xcolor}

\begin{document}
\begin{frame}{A fame}
{\huge \Ovalbox{\parbox{40mm}{\centering\textcolor{red}{Two lined \\ text}}}}
\end{frame}
\end{document}

还有很多类似的文本框宏包。在此不一一列举。

TikZ手动绘制

TikZ本身是一个画图宏包,当然也能用于绘制文本框。

一个椭圆形文本框
1
2
3
4
5
6
7
8
9
10
11
12
13
14
\documentclass{beamer}
\usepackage{tikz,xcolor}
\usetikzlibrary{shapes}
\tikzset{%
ell/.style={draw,ellipse,minimum height=3em,text width=10em,line width=2pt, align=center},
}

\begin{document}
\begin{frame}
\begin{tikzpicture}
\node[ell] {\textcolor{red}{\huge Two lined \\ text}};
\end{tikzpicture}
\end{frame}
\end{document}

关于TikZ宏包的使用细节见下文。

文字属性

文本的字体、样式、字号、颜色等设置方法与一般tex文档相同。这里是一些例子。

字号、样式和颜色

全局字号可以在开头就设置:

1
\documentclass[12pt]{beamer}

以下是行内设置的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
%设置字号(自由设置字号可以调用anyfontsize宏包)
{\Large Any text}
%加粗(需要字体支持,见下文)
\textbf{text bold}
%斜体(需要字体支持,见下文)
\textit{text italic}
%下划线
\underline{text underlined}
%删除线
\usepackage[normalem]{ulem}
\sout{Hello World}
%颜色(通常调用xcolor宏包方便使用颜色)
{\color{red} text red} %改变之后所有字符的颜色,外层括号限制颜色范围
\textcolor{blue}{text blue} %若对文本无括号,则只改变第一个字符的颜色

字体

ctexbeamer版本对中文的支持

如果安装有ctex系列模板,就可以使用\document{ctexbeamer}似乎对中文的支持更好。
这里我们默认没有安装,但是可以通过调用ctex宏包达到基本相同的效果。

我们通常希望使用系统中已安装字体。这里以Ubuntu 16.04为例,使用xelatex编译可以允许tex文档中使用TTF和OTF字体。

Linux下安装字体请参看在linux中安装/卸载字体

查看已安装的字体

在shell中运行fc-list可以查看已安装的字体:

1
$ fc-list

查看某一语言的字体,例如查看中文字体,可以加语言参数:

1
$ fc-list :lang=zh

一个例子:

查看英文字体Consolas安装情况
1
2
3
4
5
$ fc-list :lang=en | grep Conso
/usr/share/fonts/windows/consola.ttf: Consolas:style=Regular
/usr/share/fonts/windows/consolaz.ttf: Consolas:style=Bold Italic
/usr/share/fonts/windows/consolai.ttf: Consolas:style=Italic
/usr/share/fonts/windows/consolab.ttf: Consolas:style=Bold

上面的例子中,我们看到Consolas字体已经安装,路径为/usr/share/fonts/windows/consola*.ttf,包含正体、粗体、斜体、粗斜体四种样式,意味着支持设置这四种样式(有的字体没有这些样式,则\textbf、\textit不会有效果)。字体的名字就是第一个冒号到第二个冒号之间的Consolas,这个字体名字我们将在tex文档中用到

设置全局字体

使用fonstspec宏包可以在xelatex编译下调用系统TTF、OTF字体,并在导言区设置全局字体:

1
2
3
4
\usepackage{fontspec}
%\setmainfont[options]{<fontname>} % sets the Roman font for the document
\setsansfont[options]{<fontname>} % sets the Sans Serif font for the document
%\setmonofont[options]{<fontname>} % sets the Monospaced font for the document

Beamer中所有文本(包括数学环境中的英文字符)都属于sansfont,所以只有\setsansfont有效。例如

1
2
\usepackage{fontspec}
\setsansfont[Ligatures=TeX]{Helvetica Neue} %Ligatures=TeX增加非Unicode字符的支持

中文字体则在使用ctex宏包后可以设置:(独立于fontspec宏包)

1
2
\usepackage{ctex}
\setCJKsansfont{微软雅黑} %当然可以用字体的中文名称,如果有的话

字体名字必须一致

字体名称必须与fc-list查询到的字体名称完全一致,包括大小写及内部空格。fc-list结果中同一字体不同名称(如中英文名称)以英文逗号分隔。

数学字体可以改回与article类似的样式:

1
\documentclass[mathserif]{beamer}

此时数学字体回到了默认的mathfont。

有时考虑到演讲的要求,默认的字体太细,可以进一步更换数学字体:

1
2
3
\usepackage{unicode-math}
\setmathfont{Cambria Math}
%微软公式编辑器默认字体,需要额外安装,但是效果最好

这样原本正文的字体也不会被干扰。
参考Math Fonts(with Beamer)

设置行内字体

局部设置字体需要在导言区声明:

1
2
3
4
%声明
\newfontfamily\myfont[options]{<fontname>}
%调用
{\myfont Some text in the special font}

中文通过CJK设置与调用:

1
2
3
4
5
%声明
\setCJKfamilyfont{hwxk}{STXingkai} %使用STXingkai华文行楷字体
\newcommand{\hwxkfont}{\CJKfamily{hwxk}}
%调用
{\hwxkfont 华文行楷字体}

此外ctex预设了\songti \kaishu \heiti \fangsong四个字体,可以不经过声明直接调用。

图片

这一章介绍如何向Beamer中插入图形和图片。

TikZ绘制简单图形

TikZ画图的知识对于Beamer制作非常重要,内容非常多,将在后续文章中详细讲解。

插入图片

图片直接使用figure环境就可以了,一般形式为

1
2
3
4
5
6
\begin{figure}[!htbp]
\begin{center}
\includegraphics[width=\textwidth]{{../img/beamer/oil_rec}.jpg}
\caption{Figure caption}
\end{center}
\end{figure}

横排多个图片可以在figure环境中再套一层subfigure。更多的定位需要用到textblock环境文本框定位。

以下是一个稍微复杂的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
\begin{frame}{What Are Microemulsions?}
\begin{textblock}{0.9}[0,0](0.05,0.2)
\begin{itemize}
\item Water + oil + surfactant
\item Thermodynamically stable
\end{itemize}
\colemph{Applications:}
\end{textblock}

\begin{textblock}{0.9}[0,0](0.05,0.25)
\begin{figure}[!htbp]
\begin{center}
\begin{subfigure}[b]{0.3\linewidth}
\begin{center}
\includegraphics[width=\textwidth]{{../img/beamer/oil_rec}.jpg}
\caption{Oil recovery}
\end{center}
\end{subfigure}
\begin{subfigure}[b]{0.3\linewidth}
\begin{center}
\includegraphics[width=\textwidth]{{../img/beamer/ev}.jpg}
\caption{Drug delivery}
\end{center}
\end{subfigure}
\begin{subfigure}[b]{0.3\linewidth}
\begin{center}
\includegraphics[width=\textwidth]{{../img/beamer/cg}.png}
\caption{Protein crystallization}
\end{center}
\end{subfigure}
\end{center}
\end{figure}
\end{textblock}
\end{frame}

导入表格

这里不再赘述如何使用$\LaTeX$编写表格。比起手动建立tex表格,我们更希望直接导入CSV格式的数据表。我们提倡数据与文档分开,这样对于数据的更新或者利用都更加方便,也避免了对文档的污染。

导入CSV文档需要用到宏包csvsimple。而其他格式的数据表如xlsx等都可以导出称纯CSV文档。

1
\usepackage{csvsimple}

快速导入

假如在与tex文档相同目录下有test.csv需要导入建表,则

1
2
3
4
5
6
\begin{frame}
\begin{textblock}{.8}[.5,.5](.5,.5)
\centering %将表格放置于定位框中央
\csvautotabular{test.csv}
\end{textblock}
\end{frame}

标准三线表

更多复杂的用法请参见csvsimple宏包文档。这里我们以建立一个标准的三线表为例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
\documentclass{beamer}
\usepackage[english]{babel}
\usepackage{csvsimple}
\usepackage{booktabs} %\csvautobooktabular需要

\usepackage[absolute,overlay]{textpos}
\setlength{\TPHorizModule}{\paperwidth}
\setlength{\TPVertModule}{\paperheight}
\setlength{\parindent}{0pt}

\usepackage{fontspec}
\newfontfamily\timesfont{Times New Roman} %声明新字体

\begin{document}
\begin{frame}
\begin{textblock}{.8}[.5,.5](.5,.5) %页面正中放置定位框,宽度要足够大
\timesfont %设置表格字体
\centering %表格在定位框内居中
\csvautobooktabular{test.csv} %导入并建立三线表
\end{textblock}
\end{frame}
\end{document}