鸭绿江学术资源论坛's Archiver

Custom Search

stellar 发表于 2005-7-29 04:29

[07-28]用LaTeX写漂亮学位论文

  用LaTeX写漂亮学位论文(序)
一直觉得有必要写这样一篇文章,因为学位论文从格式上说更像一本书,与文章的排版
不同,不仅多出目录等文章没有的部分,而且一般要设置页眉页脚方便阅读查找。学校
有时会提出具体的格式要求,虽然复旦的要求非常简单,而且事实上并不严格执行,但
自己的论文毕竟是自己的孩子,还是要敝帚自珍的,大家都希望做得漂亮一点。

网上已经有不少学位论文的模板,其中大都出自一两个最初的版本,针对各自学校的要
求作了一些改动。这些模板还是很方便的,如果对它们的排版效果感到完全满意,那么
直接拿来用就可以了。不过如果想调整其中某些格式,就不得不仔细研究一下它们的代
码或说明文档,有时并不那么容易。而且这些模板的导言或cls或sty文件都写得很长,
内容很多,尽可能的包含了大家有可能用到的功能,但其实具体到每个人只有一部分是
需要用到的。用一个包含“冗余”代码的模板,总不是一件很舒服的事情。当然也许很
多人抱着能用就好的态度,并不care。:)

本文是为那些对论文格式有特殊要求或喜欢自己设置格式的人写的。如果你觉得网上能
找到的论文模板已经足以满足你的需要,并且对TeX本身也没有多少兴趣,那么你没有必
要花费宝贵的时间阅读本文。

阅读本文的基础是假定你已经了解怎样用LaTeX来写普通的文章。一般的TeX/LaTeX命令
不会再作解释,重点将放在学位论文与普通文章的不同点上,以及怎样用一些宏包方便
地设置其格式。其中大部分内容来源于网络资源、工具书以及各个宏包的说明文档,恕
不一一注明,在此一并致谢!

用LaTeX写漂亮学位论文(一)
首先讲一下纸张大小和页边距的设置。根据复旦的格式要求,纸张大小为A4纸,正文用
小四号字,页边距按Word中的默认设置。小四号字即12pt, Word中默认的页边距为

上边距=2.54cm, 下边距=2.54cm, 左边距=3.17cm, 右边距=3.17cm

或者换算成更容易记忆的

上边距=1in, 下边距=1in, 左边距=1.25in, 右边距=1.25in

如果我们用book类,第一句可以写

\documentclass[a4paper,12pt]{book}

然后用geometry宏包设置页边距

\usepackage[top=1in,bottom=1in,left=1.25in,right=1.25in]{geometry}

但其实这样设置的页边距极不美观,尤其是左右对称的页边距没有考虑装订的需要,而
且加上页眉后这样的上边距就显得过窄。所以注重美观的话还是自己调整一下吧。

需要注意的是,book类默认是twoside即双面打印模式,与article类默认的oneside即单
面打印模式不同。两者区别在于页边距和页码的位置。单面模式每页的页边距都相同,
双面模式则会在偶数页将设置的左、右页边距调换。如果采用单面打印,则可在
\documentclass的方括号里加上oneside参数,并在geometry的选项中适当增加左边距,
减少右边距,以留出装订线的位置。但是不要忘了装订的时候右侧一般会裁掉一点边,
所以左、右边距也不要相差过大。如果采用双面打印,则geometry中的设置被解释为奇
数页的页边距,偶数页的左、右边距会自动互换。

还有几个注意事项。首先,这里的奇数页和偶数页是针对当前page计数器的值来说的,
而不是在生成文件中总的页码。也就是说,假如当前页在整个输出中总排序是偶数页,
但当前page计数器(即显示的页码)为奇数,则当前页的页边距是按奇数页设置的。

其次,\documentclass还有一对选项openright和openany, book类默认是前者,即每一
章(包括目录)都会在奇数页开始,如果前一章的最后一页是奇数页,则会在其后插入一
页空白页,以确保新的一章仍然从奇数页开始。这是书籍的排版规范,不建议改变,论
文页数比较少的还可以借此增加页数。:)这是双面模式的情况,在单面模式下不存在这
个问题。经常有人问为什么自己明明是单面打印,却仍然会在两章之间有一页空白页,
请注意book类默认是双面模式,除非你设为oneside, 记住告诉TeX你要的是什么!

另外,为了方便查看,页码应该放在书籍的外侧。对于单面模式,外侧就是右侧,而对
于双面模式,奇数页右侧是外侧,偶数页左侧是外侧。如何设置页码留到后面讲设置页
眉、页脚时再详细说。

至于到底是单面打印还是双面打印,看你自己的喜好了。复旦的论文规范没说,一般的
做法是博士双面、硕士单面。反正总页数少于50页的话,就不要双面了,否则显得太单
薄,书脊的内容都很难打印。

最后提一个常见的问题。如果用pdf文件来打印,在Acrobat的打印对话框里有一项Page
Scaling默认是Fit to paper, 这样打印出来整个内容就会缩小一些,不再是设置的尺
寸。这是因为打印机的可打印范围不能达到整个A4纸张的全部,而是比A4纸的规格要小
一些(具体的可打印范围跟打印机型号有关), Fit to paper的意思就是把整个页面调整
到可打印范围上去,以保证所有页面上的内容都能打印出来。因为可打印范围总是小于
A4纸的尺寸,所以打印出来总是会缩小一些。缩小的比例一般为95%左右,与打印机型号
有关。解决这个问题,只要选择Page Scaling为None就可以了。

用LaTeX写漂亮学位论文(二)
这一节讲中文字体和中英文混排的问题。中文处理推荐使用CJK或新版CCT, 旧版CCT因为
年代久远,有一些bug会导致莫名其妙的问题,不建议再使用。本文以CJK为例,中文环
境为

\begin{CJK*}{GBK}{song}
...
\end{CJK*}

与英文习惯不同,中文排版一般没有粗体的概念,而是用宋体、黑体、楷体、仿宋等不
同的字体来加强文本效果。在CJK默认的字体定义文件中,宋体对应的粗体是用\CJKbold
命令通过微小平移字形来实现的,不仅放大后能看到锯齿,而且也不符合中文的排版习
惯。建议将宋体对应的粗体设为黑体,这样文中所有粗体命令作用的环境中加粗的宋体
都会自动变成黑体,不需要再用\CJKfamily{hei}来转换。

宋体的字体定义文件C19song.fd里典型的一段代码如下

\DeclareFontFamily{C19}{song}{}
\DeclareFontShape{C19}{song}{m}{n}{<-> CJK * gbksong}{}
\DeclareFontShape{C19}{song}{bx}{n}{<-> CJKb * gbksong}{\CJKbold}
\DeclareFontShape{C19}{song}{m}{it}{<-> CJK * gbksongsl}{}
\DeclareFontShape{C19}{song}{bx}{it}{<-> CJKb * gbksongsl}{\CJKbold}
\DeclareFontShape{C19}{song}{m}{sl}{<-> CJK * gbksongsl}{}
\DeclareFontShape{C19}{song}{bx}{sl}{<-> CJKb * gbksongsl}{\CJKbold}

这里C19代表GBK字符集的编码方式,m表示字符的粗细程度和宽紧程度均为中等
(medium), bx表示字符的属性为粗(bold)和松(expanded), n, it和sl分别表示正常直立
体(normal), 意大利斜体(italic)和机械斜体(slanted)。\DeclareFontShape的最后两
个参数分别是字体定义和命令序列。显然,上述语句将宋体的粗体定义为用\CJKbold
生成。要将其改为黑体,只需将这段代码改为

\DeclareFontFamily{C19}{song}{}
\DeclareFontShape{C19}{song}{m}{n}{<-> CJK * gbksong}{}
\DeclareFontShape{C19}{song}{bx}{n}{<-> CJKb * gbkhei}{}
\DeclareFontShape{C19}{song}{m}{it}{<-> CJK * gbksongsl}{}
\DeclareFontShape{C19}{song}{bx}{it}{<-> CJKb * gbkheisl}{}
\DeclareFontShape{C19}{song}{m}{sl}{<-> CJK * gbksongsl}{}
\DeclareFontShape{C19}{song}{bx}{sl}{<-> CJKb * gbkheisl}{}

实际上,正式的中文排版也不应使用斜体,而应使用楷体或仿宋代替。所以也可以类似
地将上述语句中的gbksongsl改为gbkkai或gbkfs。

上述字体定义命令可以放在sty文件中(设保存文件名为thesis.sty, 则在导言区用
\usepackage{thesis}引用,后面所述的大部分命令也都可以放在sty文件中), 而不需要
更改本地机器上的fd文件,以便在别的机器上也能产生同样的效果。

另外,为了方便可以定义几个简短的字体转换命令

\newcommand{\song}{\CJKfamily{song}}
\newcommand{\hei}{\CJKfamily{hei}}
\newcommand{\kai}{\CJKfamily{kai}}
\newcommand{\fs}{\CJKfamily{fs}}

以后就可以用\song, \hei, \kai和\fs在文中转换字体了。

在用\begin{CJK*}{GBK}{song}开始中文环境后,应加上\CJKindent和\CJKtilde两句。
前者将段首缩进设为两个中文字符的宽度。后者则是为了解决中英文混排的美观问题。
CJK*环境会吞掉跟在汉字后面的空格,从而使得源文件中的换行不会在相邻汉字之间产
生空白。但是这样一来,像下面这样输入的中英文内容

中文 abc 中文

就会产生如下效果

中文abc 中文

即abc两侧的空白不一样,很不美观。为解决这个问题,\CJKtilde重新定义了波浪符~的
意义,使得这个符号不再代表一个不可断行的空格,而是一个可断行的弹性距离,加在
中文和英文之间调整它们的距离。上面的中英文内容应该这样输入

中文~abc~中文

就能得到良好的效果。这个输入方式最好一开始就形成习惯,否则后来再加会很麻烦。
当然你也可以这样输入

中文abc中文

这样的话虽然中英文之间的距离太窄,但至少左右对称,比上述第一种方式略好,是偷
懒的办法。不过如果你比较在意排版质量的话,还是忍受一下输入~的麻烦吧。

中英文混排有一些标点的问题要处理好。首先是在默认的CJK环境里,行末的中文标点不
能与边界对齐,因为中文标点也被视为一个普通的全角字符,所以看起来行末就有了不
应该有的空白,这不符合中文的排版习惯。另外,当一行文字需要压缩或拉伸时,逗号
与句号也应该区别对待,逗号后面留的空白应该比句号小一些。这两个问题用CJKpunct
宏包就能很好地解决,只要加上\usepackage{CJKpunct}即可。

此外,中英文混排的时候是用中文标点还是英文标点呢?这并没有统一的规范。不过比
较合理也比较通行的做法是,中文后用中文标点,英文后用英文标点。比较特殊的两个
标点是句号和括号。一般数学文章习惯用全角的实心句点作为中文句号,这样看起来与
英文的句号比较一致。全角的中文括号看起来不太好看,可以统一使用英文的括号,不
过左括号前面和右括号后面最好加上波浪符~以和前后的文字留出适当的距离。

上面说的这几点也许比较琐碎,不过也正是最能看出是否精心排版的地方。

用LaTeX写漂亮学位论文(三)
下面几节讲怎样用titlesec和titletoc宏包设置章节标题、页眉页脚和目录的格式。设
置页眉页脚有一个很有名的宏包fancyhdr也可以用,不过titlesec提供的页面设计命令
更方便与它的章节标题命令配合,功能更强大。这一节先讲章节标题格式的设置。

在引用titlesec宏包时就可以指定几个格式选项,例如

\usepackage[bf,small,center,indentafter,pagestyles]{titlesec}

其中bf设置章节标题的字体为黑体,这也是默认值,可以略去。此外,还可以设为rm(罗
马体), sf(无衬线体), tt(打字机体), md(中等黑度), up(直立体), it(意大利斜体),
sl(机械斜体), sc(小体大写字母)。

small设置标题字体的尺寸,还可设为big(默认), medium, tiny。

center使标题居中,还可以设为raggedleft(居左,默认), raggedright(居右)。

indentafter相当于宏包indentfirst的作用,使标题下面的第一个段落正常缩进。

pagestyles是申明后面要自定义页面样式。

下面就可以用\titleformat, \titlespacing, \titlelabel等命令来设置标题格式了。
因为这些命令里会用到中文,所以要在设置之前放一个空的CJK环境,如

\begin{CJK*}{GBK}{song}
\end{CJK*}

下面的\titleformat命令设置了章标题的格式

\titleformat{\chapter}[hang]{\centering\LARGE\bfseries}{\chaptername}{1em}{}

其中\chapter可以换为\section, \subsection等,设置节、小节等标题的格式。

hang表示标题头与标题内容在同一行,是默认值。而book类默认的章标题是标题头与标
题内容放在两个段落,对应于display选项。此外还有block, runin, leftmargin,
rightmargin, frame, wrap等选项,一般不大用到。

\centering\LARGE\bfseries这一块是设置标题的排版格式,这里设置为居中、\LARGE尺
寸和黑体。

后面紧跟的是标题头的定义。book类里的标题头是英文,需要改成中文。如果希望改成
“第一章”这样的格式,则应先引用CJKnumb宏包,它提供了把阿拉伯数字转换成中文数
字的命令。然后定义

\renewcommand{\chaptername}{第\CJKnumber{\thechapter}章}

那么\titleformat里的标题头定义\chaptername就得到我们希望的效果。当然你也可以
不用中文数字而用阿拉伯数字,即定义

\renewcommand{\chaptername}{第~\thechapter~章}

跟在标题头定义后面的是标题头与标题内容之间的距离,这里是1em。注意,在中文环境
里1em等于一个汉字的宽度。

最后一个花括号内是在排版标题前执行的命令,这里空置。

然后用\titlespacing或\titlespacing*命令设置标题与四周的距离,例如

\titlespacing{\chapter}{0pt}{*0}{*4}

将章标题与左边、上边、下边内容的距离分别设为0pt, *0, *4。这里*n表示弹性距离,
对上距离来说相当于n ex plus .3ex minus .06ex, 对下距离来说相当于n ex plus
.1ex。弹性距离因为有一定的伸缩自由度,比较容易得到美观的排版。如果想自己指定
用关键字plus, minus定义的弹性距离,可以用星号版本的命令,即

\titlespacing*{命令}{左距离}{上距离}{下距离}

上面设置了章标题的命令,用相同的命令也可以设置节、小节等的标题格式。但如果没
有特殊的要求,只希望修改一下标题头,可以用更加简单的命令\titlelabel来设置。例


\titlelabel{\S\thetitle\quad}

将章节标题设置为类似“§1  标题内容”的格式。这里\quad等于\hspace{1em}, 即空
出一个汉字宽度的距离。注意,\titleformat命令的定义会覆盖\titlelabel的定义,而
一般来说章跟节标题的格式不一样,所以只要另外用\titleformat命令定义章标题的格
式,\titlelabel的定义就只能作用于节以下层次的标题了。

用LaTeX写漂亮学位论文(四)
这一节接着讲怎样用titlesec宏包提供的命令设置页眉、页脚。下面命令定义了一个新
的页面样式并使用该样式

\newpagestyle{main}[\small\kai]{
\sethead{}{}{\ifthechapter{\chaptername\quad}{}\chaptertitle\qquad\thepage}
   \setfoot{}{}{}\headrule}
\pagestyle{main}

其中方括号内的格式设置\small\kai是对整个样式的定义都有效的。在后面的定义中用
\sethead命令设置页眉,格式为

\sethead[偶数页左页眉][偶数页中页眉][偶数页右页眉]
   {奇数页左页眉}{奇数页中页眉}{奇数页右页眉}

单面打印模式只要给出奇数页的设置即可,双面模式则需要将左、右页眉做个调换。上
面给出的例子是单面模式的。对应地在双面模式下可以写为

\sethead[\thepage\qquad\ifthechapter{\chaptername\quad}{}\chaptertitle][][]
   {}{}{\ifthechapter{\chaptername\quad}{}\chaptertitle\qquad\thepage}

\setfoot用来设置页脚,格式与\sethead类似。

在页眉、页脚里可以显示章节标题、页码等内容。如上面的例子就在页眉中显示了章标
题和页码。注意,\qquad相当于两个\quad, 即\hspace{2em}。

\headrule是划出页眉线,类似地\footrule划出页脚线,不过比较少用。默认页眉线的
宽度是0.4pt, 如果不满意,可以用下面命令重新设置其宽度

\setheadrule{宽度}

最后,上面的代码中用到了一个判断语句\ifthechapter, 是为了解决在目录、参考文献
或以\chapter*命令生成的章,标题头\chaptername不应显示的问题。

此外,关于页面样式还有两点需要注意。首先,尽管在上面例子中用\pagestyle{main}
使用了自定义的页面样式,但每一章的第一页不受影响,仍然使用默认的plain样式。在
这种页面上,出于美观的考虑,一般不加页眉,而将页码放在页脚(也有人喜欢不加页
码)。所以plain样式(没有页眉,页码放在页脚中间)已经基本符合要求,不必修改。如
果需要修改,可定义一个新的页面样式,再用下面命令重定义plain样式

\renewpagestyle{plain}{新的页面样式}

其次,在双面模式下,如果一章的最后一页落在奇数页上,系统就会自动在其后补上一
个空白页,以使新的一章总是从奇数页开始。但是这多加上的空白页却仍是有页眉页脚
的!这显然很不好看,为了让它彻底地“空白”,我们可以重定义\cleardoublepage(加
入空白页的动作就是由这条命令来完成的)如下

\makeatletter
\renewcommand\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
\hbox{}\thispagestyle{empty}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
\makeatother

univillage 发表于 2005-8-10 01:19

Latex 是好东东,就学起来 有些麻烦!

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.