实践——LaTeX按需排版

2009年5月12日星期二

Tagged_by_kmc:
latex, word, pdf,
排版, 尺寸控制, 微调, word模板, geometry, fancyhdr, logo, 标志, 会议, 测量, 精确控制, dimension.

这是我博士课程中的第一篇投稿,总觉得国外LaTeX的使用频率应该是很高了吧,没想到依然是个冷冰冰的Word模板放在那里,如下 (Word转成的PDF,里面有我所有的测量值):
http://www.megaupload.com/?d=UV4Y30SE

用了这么久的LaTeX,我可不想第一次就倍受打击地重新拣起Word(因为一想到没有断字的Word排版效果,包括参差不齐的单词间距,我就毛骨悚然,真的!)正好,也想找机会试试看LaTeX到底有多少自由度,能不能按照别人的格式要求精确地调整出预期的结果。最终,我的投稿已经被采纳,没有编辑对版式提出意见,于是打算分享这些经验,因为没有学过写Class,写成模板也没有谁能用得上,不如讲讲用了哪些dirty tricks,仅仅是为了应急。希望能给碰到类似尴尬局面的TeXer们一点参考,也希望高手笑过之后指点一下,哪些方面有更好的方法。如果以后有时间,可能会用LaTeX写成PDF教程并放上图片,看看光用文字描述是不是能让大家看懂吧。

阅读本文需要的知识:LaTeX基础知识(能看懂lshort),页面尺寸方面的知识(边距,缩进,行距,页眉页脚等),了解常用宏包(titlesec, fancyhdr等),一点点字体载入方面的知识。

由于模板是法语写的,所以大致介绍一下模板的要求:

  • A4,左右页边距为2cm,上边距2.5cm,下边距2cm
  • 页眉页脚高为1.25cm,除了首页,由于要插入会议名称和Logo,首页页眉为2.5cm
  • 双栏排版,栏宽为8.12cm,两栏间距0.75cm
  • 字体方面全用Times。文章标题16pt粗,作者和单位10pt斜;section标题12pt粗,subsection标题10pt斜,正文10pt
  • 作者/单位的格式是上标引用型,下面立即写出所属单位
  • 正文段落缩进0.5cm,标题序号阿拉伯数字后带一个“.”section标题内容(除了数字)缩进0.5cm(相对于边距而不是相对于前面的那个“.”),subsection的序号缩进0.5cm(即subsection的序号跟section的内容对齐),内容缩进1.5cm
  • 图片和表格的caption在模板中没有具体文字描述,但是看效果是粗体,阿拉伯数字并且是换行后缩进(hang模式)
  • 首页页眉:会议名称,会议Logo
  • 最多15行的Abstract(法语中叫Résumé),斜体
  • 参考文献格式疑似IEEEtran,没有具体要求,我用了IEEEtran

其中一些要求很好实现,另一些很变态。

编译方式:PDFLaTeX

----------------页面尺寸----------------

我们先来说跟页面尺寸有关的。首先geometry宏包是不能用了(事实上我是多次想用它的,最终都失败了),只有自己手工调整。由于模板提供了WordPDF的效果,我正好可以用Acrobat的测量工具来量尺寸(当然会引入一些微小的误差),并且通过Try and error来调整,没有技术活,只是力气活。这一部分的内容如无特别说明,都在\begin{document}之后出现。

首先定下双栏的栏宽和栏距,实践发现最方便的办法是做一个小计算:

\setlength{\textwidth}{17.06cm}

\setlength{\columnsep}{0.75cm}

“(textwidth-columnsep)/2 = 8.155cm”,原本来说应该等于8.12cm,实际测量发现模板里面也是8.155cm(通过多次测量,发现不是自己的测量误差),不过0.035cm的差距基本不影响实际打印效果。

于是试着编译了一下发现生成的text block在页面上不是很居中,不知道原因。最终量出来这样的设置

\addtolength{\hoffset}{-0.58cm}


text block“挪动到合适的位置上。这样一弄,left/right margin自然 = 2cm(根据A4纸的总宽度,他们不是独立的变量)。

下面讲讲真正最变态的要求,也是这次排版中遇到的最大挑战(我曾经在论坛发帖《latex中如何判断现在是第几页?》和《页面尺寸精调的最后一点小问题》),最终的解决方式是一个很dirty的巧合。

这篇文章要求首页的页眉高跟之后的不同,由于首页要放会议题目和logo,首页页眉要2.5cm,后续的页面则只需要1.25cm。可是页脚的高度要不变!(IEEE的模板不是这样,所以没有模板可以参考)。于是简单地调整voffset不可行。我原来是想,默认尺寸是第一页的尺寸,到第二页再改,也就是说动态地调整textheight,可这样又会碰到一个很头痛的问题:LaTeX如何知道现在已经到了第二页?想知道的话除非读source2e,没时间啊!

换个角度想想,既然就只有第一页跟其它不一样,不如默认按234...页的尺寸设置,而在第一页单独改动。于是测量模板的第二页的页眉,并反复对比页脚到页面最下方的距离,得到:

\addtolength{\voffset}{-1.96cm}
\addtolength{\textheight}{3.90cm}

这样第二页和后续页的text block放置已经没有问题。剩下首页,由于首页我是用\maketitle来生成标题作者等等,我想到的是在\title{}命令里面做文章,事实上我让页眉的内容也到了\title{}命令里面:


\title{
\vspace{-0.74cm}\fontsize{16pt}{16pt}\selectfont
{
16\textsuperscript{èmes} Journées Nationales Microondes
\\
27-28-29 Mai 2009 Grenoble
}
\\
\vspace{1.35cm}
文章标题}

也就是说,我先纵向移动-0.74cm,写上会议标题16……会议(也就是山寨版的页眉),再移动1.35cm到真正标题位置写标题。这个方法不会改变页脚的高度,因为没有去碰\textheight

----------------字体相关----------------

文档全局设置为:


\documentclass[10pt, a4paper, twocolumn, fleqn]{article}


16pt这个尺寸在LaTeX默认的\small, \huge等等是调整不到的,两种方法,LaTeX标准字体选择方式

{\fontsize{16pt}{16pt}\selectfont 内容}

或者原始一点的

\newcommand{\ptmseize}[1]{\font\x=ptmb at 16pt \x #1}

因为ptmb就是Times bold,我这个命令连\textbf{}也包括了进去。



----------------
标题相关----------------


跟章节标题有关的自然都要请出titlesec宏包,在导言区写


\usepackage[bf, small]{titlesec}
\titleformat{\section}{\bf\large}{\thesection.\,}{0.24em}{}
\titlespacing{\section}{0cm}{*1.5}{*1.1}
\titleformat{\subsection}{\it}{\thesubsection.\enspace}{0.5em}{}
\titlespacing{\subsection}{0.5cm}{*4}{*1.5}



其中“\,”“0.24em”是反复测量出来的值,它们保证section标题内容(除了数字)缩进0.5cm\thesection后面的“.”就是标题序号和内容的分隔点,而那个\bf\large命令则保证在10pt的正文中出现12pt粗体的标题;由于section序号不要缩进,在\titlespacing里面写的是0cmsubsection的设置完全类似,除了序号缩进0.5cm。至于里面的*1.5*1.1,指的是标题前后的弹性空间,由于模板没有具体要求,我是按自己的美观标准和文章的篇幅限制来选择的,因为把他们设置小一点可以省下很可观的空间,前提是不要跟前后的正文粘得太紧。

那个Abstract,我看也没有什么特别要求,没必要弄一个环境


\noindent \textbf{\textit{Résumé}}
{\itshape }


----------------作者相关----------------

作者和单位,我用的是authblk(全称Author Block)宏包,具体可以看看这个宏包的文档,感觉是挺好用的。
导言区


\usepackage[noblocks]{authblk}



正文区


\author[1]{\normalsize author1}
\author[2]{\normalsize author2}
\affil[1]{\normalsize\itshape address1}
\affil[2]
{
\normalsize\itshape Boss' address
\authorcr
\href{mailto:kmc's Email address}{\normalsize \itshape kmc's Email address} : \normalsize \itshape correspondant principal
}



看得出来吗?我又把通信作者的Email地址到第二个单位(\affil[2])里面去了,注意在authblk宏包定义的换行符是\authorcr而不是\\

说起来,IEEE模板里面反而显得很dirty,用的是{\small $~^{\#1}$}这种方式。或许dirty和不dirty的区别仅仅是格式代码放在宏包里还是放在你眼前的差距?

关于{\itshape My text}还是\textit{My text},其实我主要是嫌后者要删除的时候很麻烦,既要删除命令又要删除括号,当然你可以说大括号不用删除,{My text}也不影响,但是无意义的大括号很影响代码的整洁,\itshape有一个作用域的限制,但是在\title{}, \author{}命令里面已经限制了作用域了,不用担心\itshape作用到外面去。

----------------其他设置----------------

caption宏包


\usepackage{caption}
\DeclareCaptionLabelSeparator{period-quad}{.\quad}
\captionsetup{format=hang, singlelinecheck=no, labelfont=bf, font={normalsize,bf}, figurename=Figure, tablename=Tableau, labelsep=period-quad}


声明一个你需要的分隔符,因为模板要求Figure 1后面有一个“.”,距离大约是一\quad这么远,于是我就弄了一个period-quad放到labelsep=后面。

fancyhdr
宏包
由于这种投稿的文章不要页码,我是这样设置的,在\title命令之前放这样的代码


\fancypagestyle{empty}{
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0.5pt}
\fancyfoot[C]{16\textsuperscript{èmes} Journées Nationales Microondes, 27-28-29 Mai 2009 - Grenoble}
\fancyfoot[L]{}
\fancyfoot[R]{}
}


这样就控制了第一页的pagestyle,下面,在你源代码靠近编译结果第一页结尾的内容附近放上


\pagestyle{empty}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0.5pt}
\fancyhead{}
\fancyfoot[C]{16\textsuperscript{èmes} Journées Nationales Microondes, 27-28-29 Mai 2009 - Grenoble}
\fancyfoot[L]{}
\fancyfoot[R]{}


用来控制第二页,这里并不一定需要精确知道源代码什么位置对应编译结果的第二页,说实在的我不知道为什么一定要这样,但是如果不这样的话第二页的页脚会往 上移动…………另外为了保证首页无页码,在\maketitle命令后面紧跟\thispagestyle{empty},这个已经被问过很多次了。

浮动体方面除了graphicxsubfigure(好像我没有用到)外,就是booktabsmultirowmakecell宏包用来画表,不过这跟本文没有太大关系。浮动体用的是传统设置


\setcounter{totalnumber}{4}
\renewcommand{\textfraction}{0.15}
\renewcommand{\topfraction}{0.85}
\renewcommand{\bottomfraction}{0.65}
\renewcommand{\floatpagefraction}{0.60}
\setlength{\textfloatsep}{5pt plus 2pt minus 2pt}
\setlength{\intextsep}{12pt plus 2pt minus 2pt}
\setlength{\abovecaptionskip}{5pt}
\setlength{\belowcaptionskip}{0pt}


其中\textfloatsep\intextsep中的值是弹性长度,表示5pt ± 2pt,当然你也可以设置为 5pt + 10pt - 8pt,表示最多15pt,最少-3pt,用来节省页面篇幅的(因为开始初稿只让写两页,空间实在太少)。我原来一直没弄明白这个,现在趁机解释一下(没准还解释错了……)。


----------------
插入logo----------------


还有一个问题就是由于我没有在首页使用页眉,我目前只进去了会议名称,Logo怎么办?网上有说用pgf来放(pgfdeclareimagepgfuseimage),我没有成功,郁闷。不过搜索到一个还算好用的eso-pic宏包,导言区


\usepackage{eso-pic}
\newcommand\BackgroundPic{
\put(16.57, 23.19){
\parbox[t]{\textwidth}{
\includegraphics[scale=1,keepaspectratio]{logo_jnm.png}%
}
}
}



正文紧接\begin{document}后面写


\AddToShipoutPicture*{\setlength{\unitlength}{1cm}\BackgroundPic}


具体来说就是先声明一个\BackgroundPic命令,这个命令在16.57 23.19的位置放一个宽为\textwidthparbox,里面放上你要的图片Logo。这个Logo我是从Doc模板里面截出来的,按Word100%显示比较缩放成一丝不差,所以scale=1并且keepaspectratio。注意那个\unitlength只有在正文区可以声明,所以导言区的16.5723.19没写单位。



----------------
平衡双栏----------------


末页的双栏平衡,有很多说法,我就只是用了flushend宏包而已,没有遇到网上传说的问题,可能是我末页的浮动体比较少的缘故。


差不多就这些了,在尝试排版的过程中,可以打印测试页,跟Word的打印结果发在灯光下透视着比较。打印PDF的时候一定要注意,Acrobat打印A4纸的时候,根据打印机的不同,如果你选择了适合打印机边距,可能会缩放97%,实际效果有出入但事实上你的页面尺寸是正确的!所以页面缩放一定要选。到时候编译说你尺寸不合适,非要你用Word的时候,你可以骄傲地把两张纸放在一起给他看两个Logo,两条页脚线是如何完美重合到一起的。







0 个评论: