XeLaTeX从零学起05_表格与插图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XƎL A T E X从零学起05
表格与插图
sunxb10*
2013年3月24日
1一个简单的表格
作为入门,我们首先来排版一个简单的表格:
XƎL A T E X提供了table与tabular这两种环境,其中tabular是表格本身,table则负责为tabular 环境加上标题、索引并设置对齐格式。
因此tabular可以单独使用以输出简单的表格;table则要包含tabular,以提供更加完善的表格。
大体的命令如下:
\begin{table}[htbp]
\centering
\caption{...}
\begin{tabular}{|c|c|c|}
\hline
...&...&...\\
\hline
...&...&...\\
\hline
\end{tabular}
\end{table}
从内向外逐项来看:
\begin{tabular}{|c|c|c|}|与\end{tabular}之间就是tabular环境,可以看出它与之前数学公式中的array环境非常类似,实际上这两个环境的命令是完全一样的,&和\\的含义都不变。
有变化的就是表格线,其中{|c|c|c|}就是在{ccc}的基础上加上了4条竖直线(表格左右两侧各1条,每两列之间也加1条),|的位置就是插入的竖直线的位置,比如{c|c|c}就表示只在两列之间加竖直线,表格左右两侧无竖直线。
\hline表示在对应位置加水平线,水平线实际上是独占了一行,因此上面的代码表示表格有两行,且加入了三条水平线。
\caption{...}用于设定表格的标题,如果设定\caption{}则最终输出的表格没有标题,只显示表格序号。
\centering设置表格在整个页面内居中显示,居左是\flushleft,居右是\flushright。
\begin{table}[htbp]中的[htbp]设定表格的位置为优先排在当前位置(here),如果不行就按照页面顶部(top)、底部(bottom)或新的一页(page)的顺序匹配排版位置。
从道理上
*本文大量借鉴和参考了《一份不太简短的L A T E X2ε介绍》、《XƎL A T E X与WinEdt6.0入门指南》等作品,以及诸多网友发表在网络上的博客文章。
特此声明相关作品的版权归其原作者所有,并在此向他们表示感谢!
来讲,我们只要使用[h]这单独一个参数值就行了,它将让表格出现在当前位置,但后面我们会看到真实情况绝非如此简单。
熟悉了各项指令之后,我们来上手排版一个最简单的表格:
\begin{table}[htbp]
\centering
\caption{a simple table}
\begin{tabular}{|c|c|c|}
\hline
a&b&c\\
\hline
A&B&C\\
\hline
\end{tabular}
\end{table}
Table1:a simple table
a b c
A B C
在上面的基础上做一点变化:
将上面代码中的{|c|c|c|}改成{c|c|c},并删掉第一个和第三个\hline。
再在导言区加入以下两行代码:
%将表格序号与标题之间的冒号改为空格
\captionsetup[table]{labelsep=space}
%将表格序号中的“Table”改为“表”
\renewcommand\tablename{表}
之后得到的将是这样的效果:
表2a simple table
a b c
A B C
如果你能够理解上面两个表格为何会有不同的形式,那么请你在上面的基础上实现下面这个表格(表格序号具体是多少并不重要,目前你只需要关心表格的形式):
表3a simple table
a b c
A B C
如果你能够独立地实现第三个表格,那么恭喜你,你已经掌握了XƎL A T E X中最基本的制表方法。
2一幅“简单”的插图
对于初学者,在XƎL A T E X中加入插图绝对不是件简单的事情。
除了对XƎL A T E X指令本身不熟悉之外,初学者常常会感到不爽的就在于为何XƎL A T E X只支持.eps图片格式,而对于人民群众喜闻乐见的.jpg、.bmp格式都不支持呢?这是由于.eps是矢量图格式,.jpg、.bmp都是位图格式。
所谓矢量图就是指整幅图片是由一系列特定的指令生成的,在任何放大倍数下都不会模糊;位图则是由文件存储的所有像素点上的颜色等信息生成的,放大之后会模糊。
熟悉PS的同学对这两个概念一定不会陌生。
XƎL A T E X天生地带有“完美主义”标签,因此它只支持矢量图,具体就是.eps格式。
为了演示下面的例子,我们需要几张.eps格式的图片,获取.eps文件的方法有以下几种:使用CorelDRAW或Adobe Illustrator绘制.eps矢量图、百度搜索“.eps矢量图”并下载、使用MATLAB生成.eps矢量图或者使用软件将.jpg图片转换为.eps图片。
对于前三种方法不做过多介绍,至于最后一种方法,相关的软件有很多,对于我们这样的非专业人士,可以百度搜索并下载“jpg2eps”,这是一个非常小的程序,可以实现转换功能,在不过分苛求的条件下,它转换得到的图片质量也还说得过去。
本教程前面几篇的插图都是用这种方法实现的。
好了,现在我们假定你已经得到了一张.eps图片,譬如说001.eps,把它放到你的.tex文档所在的目录下,之后我们就以这个图片为例来介绍插图的实现。
XƎL A T E X的插图是由figure环境实现的,具体指令为:
\begin{figure}[htbp]
\centering
\caption{}
\includegraphics[width=0.5\textwidth]{001.eps}
\end{figure}
可以看出插图的指令与表格指令非常类似,相同的指令在此就不再重复了;不同的只有\includegraphics[width=0.5\textwidth]{001.eps}这一条。
这条指令的中括号内width参数是设置插入图片的宽度,\textwidth是XƎL A T E X输出作品的文本宽度,因此上面的命令实际上就是设定插入图片宽度为文本宽度的一半。
001.eps是要插入的文件名,之前提到过要把001.eps与.tex放在同一个目录下,这样在插入图片时就不用再输入001.eps的路径了,XƎL A T E X会直接找到位于同一目录下的这个文件。
另外,与排版表格时类似地,在导言区加入这两条指令:
%将图片序号与标题之间的冒号改为空格
\captionsetup[figure]{labelsep=space}
%将图片序号中的“Fig”改为“图”
\renewcommand\figurename{图}
之后进行编译,得到的效果应该如图1所示。
好吧,我知道肯定会有同学对我使用的这幅图感兴趣。
这幅图就是用MATLAB生成的蝙蝠侠函数(Batman Equation)的图像,相应的.m文件可以从网上下载:http://www. /matlabcentral/fileexchange/33124-batman-equation-the-legend,其作者是Mingjing Zhang。
有些时候我们可能希望将用到的所有插图都保存在一个文件夹里方便整理,比如在.tex所在的目录下新建一个名为“figure”的文件夹,然后把我们所使用的001.eps移动进去,再编译
图1
上面的插图指令,结果一定会报错,因为XƎL A T E X找不到插图文件了。
这时可以使用相对路径来标示插图文件的位置,即:
\includegraphics[width=0.5\textwidth]{figure//001.eps}
figure文件夹与.tex在同一目录下,001.eps在figure文件夹中,figure//001.eps就是插图相对于.tex文档的相对路径,如此就可以正常编译了。
XƎL A T E X中文件路径使用//标示层次关系,这与Windows中的\是不同的。
如果无法用相对路径到达的话,可以使用绝对路径,比如F://Programming//LaTeX//001.eps。
如果所用的插图背景是白色,可能还需要对图片加框以显示图片与文档空白的区别。
给插图加框的方法是用\fbox{...}将includegraphics括起来:
\fbox{\includegraphics[width=0.5\textwidth]{figure//001.eps}}其效果如图2所示
图2
3浮动体
前面提到过使用[h]位置参数并不绝对地使图表出现在当前位置;在排版插图时我们也会发现,图片并不总是出现在我们希望它出现的地方;更进一步地,你会发现你无法在tabular环境中使用\footnote{...}脚注。
这些都是因为表格和插图本质上都是浮动体,它们没有固定的位置,是“浮”在文本之上的,可以根据版面情况自行移动位置。
习惯使用Word的人可能会感到不可思议:“什么?我连自己文章中插图出现的位置都没法控制?!”毕竟,在Word中我们可以用鼠标随意地拖动图片,把图片放置在任何一个你希望的位置上,完全是WYSIWYG(所见即所得)的效果;而在XƎL A T E X中这些就是不可能的。
但是,这是XƎL A T E X的缺陷吗?换言之,我们需要手动地、完全自主地设定所有图表的位置吗?
以我的看法,我们不需要这么做。
首先,人的时间总是比机器的时间更加宝贵,机器可以完成的事情就不要让人来代劳。
排版图片的具体位置是一件非常低效率的事情;并且如果前文有修改,那么你将不得不从头到尾再一张张地拖动图片。
使用自动排版不仅效率高,而且能自动适应因前文修订而造成的位置变化。
其次,手动排版的图片往往为了照顾正文与图片的对应关系而显得位置杂乱,影响作品的整体美感。
XƎL A T E X提供了功能强大的交叉引用功能,我们应该充分利用这一功能,应该习惯像“图1”、“图2”这样的索引方式,而不是“上图”、“左图”,因为前者是可以随文章的修改而动态变化的,后者则指向固定的位置,非常死板,并且也很不专业。
也许你还是很难接受XƎL A T E X的这一特点,就像学游泳一样,初学者往往担心沉入水底而在水中挣扎,事实上,放轻松些,你完全可以悠闲自在地躺在水中;XƎL A T E X排版也是一样,放轻松,只要会用交叉引用功能,你完全可以把所有图表的位置交给XƎL A T E X去自动匹配。
当然,XƎL A T E X对浮动体的处理也绝对不是十全十美的,但绝大多数情况下它都会比用Word手动排版的图表更加整洁、美观。
至于有时图片离相应正文太远造成阅读困难的问题,你可以通过调整图片大小来改变版面,甚至可以在图片下方再加一个返回相应正文的交叉引用。
在具体参数的选择上,建议大家使用[htbp];强烈不建议使用单参数[h],因为如果当前位置无法排版的话,这个浮动提就会“堵塞”整个排版等待的队列,使后续浮动体无法排版,最终导致所有的浮动体都被挤压到最后一页。
另外,在参数前加感叹号则表示严格按照所设定的顺序匹配位置,比如[!hp]就严格限定浮动体必须优先放置在当前位置,如果不行就必须放置在下一页上,不论最终显示效果是否美观。
一般情况下不建议使用这样的强制命令。
4交叉引用
交叉引用可以用在插图、表格、公式、文本等处,具体通过以下指令实现:
\ref{...}
\label{...}
在要引用的位置使用\ref{...},在引用所指向的目标对象处使用\label{...},显然括号内填入的标记应该一致,否则无法正确指向引用对象(引用出现错误时,标记处将出现问号??)。
标记可以随意命名,但最好选择有明确含义的、有代表性的名称,比如将标记命名为“fg:001”显然就比命名为“1”更好,因为前者显示了该引用的类型为figure(图片)。
使用交叉引用需注意有时可能要两到三次编译才能得到正确结果,并且最好载入hyperref 宏包。
对于插图和表格而言,\label{...}应该放在\caption{...}之后。
对于公式而言,要引用的公式最好有编号,否则无法使用连接。
以下是使用交叉引用的几个例子:
1、插图:
图\ref{fg:003}显示了蝙蝠侠函数的图像。
\begin{figure}[htbp]
\centering
\caption{}
\label{fg:003}
\fbox{\includegraphics[width=0.5\textwidth]{figure//001.eps}} \end{figure}
图3显示了蝙蝠侠函数的图像。
图3
2、表格:
表\ref{tb:001}显示了${}^{235}$U裂变释放的能量情况。
\begin{table}[htbp]
\centering
\caption{}
\label{tb:001}
\begin{tabular}{c|c}
\hline
能量形式&能量/MeV\\
\hline
裂变碎片动能&168\\
裂变中子动能&5\\
瞬发$\gamma$能量&7\\
裂变产物$\gamma$衰变−−缓发$\gamma$能量&7\\
裂变产物$\beta$衰变−−缓发$\beta$能量&8\\
中微子能量&12\\
\hline
总计&207\\
\hline
\end{tabular}
\end{table}
表4显示了235U裂变释放的能量情况。
表4
能量形式能量/MeV
裂变碎片动能168
裂变中子动能5
瞬发γ能量7
裂变产物γ衰变–缓发γ能量7
裂变产物β衰变–缓发β能量8
中微子能量12
总计207
3、公式:
式(\ref{maxeq:01}$)\sim$(\ref{maxeq:04})就是麦克斯韦方程组。
其中式(\ref{maxeq:03})实际上就是法拉第电磁感应定律。
\begin{align}
&\nabla\cdot\mathbf{E}=\frac{\rho}{\varepsilon_{0}} \label{maxeq:01}\\
&\nabla\cdot\mathbf{B}=0\label{maxeq:02}\\
&\nabla\times\mathbf{E}=−\frac{\partial\mathbf{B}}{\partial{}t} \label{maxeq:03}\\
&\nabla\times\mathbf{B}=\mu_{0}\mathbf{J}_{0}+\mu_{0}\ varepsilon_{0}\frac{\partial\mathbf{E}}{\partial{}t}
\label{maxeq:04}
\end{align}
式(1)∼(4)就是麦克斯韦方程组。
其中式(3)实际上就是法拉第电磁感应定律。
∇·E=ρ
(1)
ε0
∇·B=0(2)
∇×E=−∂B
(3)
∂t
∇×B=µ0J0+µ0ε0∂E
(4)
∂t
5表格使用进阶——合并单元格
合并单元格看似简单,但实际上它大大丰富了我们的表格类型,那么Excel中神乎其技的合并单元格在XƎL A T E X中能否实现呢?
答案必须是可以的(废话!)不过在XƎL A T E X中,合并列与合并行的操作是不同的,以下分别介绍:
5.1合并列
\multicolumn{n}{c}{...}
其中n是欲合并的列数,从当前列开始向右算(包括当前列)。
c是单元格内文字的对齐方式,与tabular环境的参数含义相同,也可使用|在两侧插入竖线,合并单元格的左右竖线不受tabular环境整体设置的影响。
{...}是合并后单元格的内容。
合并后的单元格将成为一个整体,使用&时要注意这点,考虑好这个单元格占了多少列。
一个合并列的例子,请重点关注竖直框线:
\begin{table}[htbp]
\centering
\caption{}
\begin{tabular}{|c|c|c|c|c|}
\hline
&\multicolumn{3}{c|}{A}&\\
\hline
\multicolumn{2}{|l}{B}&a&b&c\\
\hline
d&\multicolumn{4}{r}{C}\\
\hline
\end{tabular}
\end{table}
表5
A
B a b c
d C
5.2合并行
合并同一列中的若干行需要multirow宏包(前面提到的\multicolumn指令不需要添加宏包支持),合并的指令为:
\multirow{n}{width}[fixup]{...}
n是欲合并的行数,从当前行开始向下算(包括当前行)。
width用于设定合并后单元格的宽度,如果希望XƎL A T E X自动调整,则输入“*”。
fixup是可选参数,用于设定单元格中文本
的竖直位置,以中央为0,以pt或cm做单位,向上为正值,向下为负值。
{...}是合并后单元格的内容。
合并后的单元格是一个整体,输入下一行的元素时要使用&跳过该单元格所占用的列。
此外,XƎL A T E X本身还提供了\cline{i-j}指令用以产生从第i列到第j列的水平横线(包括第i列和第j列,i和j可以相等),它可以与\multirow配套使用。
\hline指令遇到合并的单元格时会自动将单元格拆分,因此必须使用\cline{i-j}来处理合并单元格的水平框线,使用时要计算好\cline{i-j}的始末行列。
与输入元素不同,在输入横线\cline{i-j}时不需要用&跳过合并单元格所占用的列,只需要设定i和j的值使之避开合并单元格所占用的列就行。
一个合并行的例子:
\begin{table}[htbp]
\centering
\caption{}
\begin{tabular}{|c|c|c|c|c|}
\hline
a&\multirow{3}*{A}&b&c&d\\
\cline{1−1}\cline{3−5}
e&&f&g&h\\
\cline{1−1}\cline{3−5}
i&&j&\multirow{2}*[10pt]{B}&k\\
\cline{1−3}\cline{5−5}
l&m&n&&o\\
\hline
\end{tabular}
\end{table}
表6
a
A b c d
e f g h
i j B k
l m n o
综上,\multicolumn、\multirow、\cline三条指令加起来就可实现跨行且跨列的各种单元格合并。
6插图使用进阶——横向并列排版两张图
有时候插图的宽度比较窄的话,我们可能希望能够并列的排版两张图,这其中又分为两种情况:各有标题和共享标题。
6.1图片并排,共享标题
在figure环境中使用多行\includegraphics指令即可,但要注意两张插图的总宽度不能超过页面宽度,否则就会变成纵向排版。
图片并排、共享标题的例子如下:
\begin{figure}[htbp]
\centering
\includegraphics[width=0.45\textwidth]{figure//001.eps}
\includegraphics[width=0.45\textwidth]{figure//002.eps}
\caption{}
\label{fg:004}
\end{figure}
输出效果如图4所示。
图4
6.2图片并排,各有标题
这可以用minipage环境实现,具体指令如下:
\begin{figure}[htbp]
\begin{minipage}{0.45\textwidth}
\centering
\caption{}
\label{fg:005}
\includegraphics[width=0.9\textwidth]{figure//001.eps}
\end{minipage}
\begin{minipage}{0.45\textwidth}
\centering
\caption{}
\label{fg:006}
\includegraphics[width=0.9\textwidth]{figure//002.eps}
\end{minipage}
\end{figure}
简单地说就是用minipage环境将一张图包装起来,用两个minipage环境就可以实现两张图的并列。
\begin{minipage}之后大括号的值就是这个minipage的宽度。
需要注意的是使用minipage环境时候,\includegraphics后面的宽度设置,minipage中的\textwidth就是相对于minipage的文本宽度,因此宽度值会比不用minipage时要大。
代码输出的结果如图5、图6所示。
图5
图6
11。