Sunday, December 13, 2009

2009-11-16: 现阶段写科技论文一些工具、心得

(一直放在邮箱里,忘记post出来了,orz....已经隔了一个月 = =||| )
 前言:
能寫的太多了,从方法论到具体细节其实很多都可以说上几句。
簡直不可能一次全部介绍完,所以这里我尽量简洁地给出一些keyword来记录点点滴滴。

工具篇:

latex+bibtex+jabref等一系列工具。在office我主要用CTeX套装,而在Linux环境下我用texlive。CTeX的好处是,在windows下使用非常方便,安装好即可使用。另外配套的WinEdt工具已经做好了TeX、LaTeX、PDFLaTeX几种工具,非常方便编译与运行PDF viewer。

bibtex与jabref主要是用来管理文献,我想这里需要另外一篇文章来介绍,不过搜索后发觉这篇文章几经介绍得不错了:
《bibtex现学现卖》:http://derecks.blog.sohu.com/118984444.html

另外,我希望能找到一篇总结bibtex里面各个entry作用,如article,conference,inproceedings(会议录)等的区别;
以及reference里面排版惯例的介绍。(后来知道conference=inproceedings)
在文档 《How to Use the IEEEtran BibTeX Style》里有一点介绍,我想已经足够日常使用了。
我在附注2总结了一些重要的points。

最后, 则是利用aspell等工具,来检查你的拼写错误、语法建议等。这里有一篇非常不错的文章。

格式篇:
因为我提交的paper主要是IEEE的,所以一般会按照它的格式进行编写。
IEEE的不同会议一般提供了LaTeX的模板(style file),其实就是双栏以及一些字体等细节方面的格式设置。
它是这样使用的:

(1) 如果是sty文件,则当成一个package使用,下面是最近的ASP-DAC'10 会议提供的aspdac2e.sty的使用方法:
\documentclass[twocolumn,letterpaper]{article}
\usepackage[letter]{aspdac2e}

(2) 如果是cls文件,则直接使用为文档类,如下:
\documentclass[conference]{IEEETrans}

总是,效果大致是相同的。

在一开头就使用预定的格式写作论文,好处是paper被接收后,要准备camera ready version时不会改得这么痛苦,
我第一次交时就改格式改了好久,当时碰到了三个问题:
  • 包含了超链接——IEEE不允许使用
  • 包含了书签——也不允许
  • 没有内嵌所有字体——这个是最重要的,因为考虑到不同系统的PDF viewer不一定提供了你使用的字体。
在提交paper时,必须通过一个叫做IEEE PDF eXpress的工具的检查才能使用。这个工具提供了检测、转换等一系列服务,以生成合适格式的论文。
我还没研究透,以后可以另外写一篇总结。

当然,在论文初始提交阶段,也许可以不用那么严格。比如,一般会议要求不超过8页,那么可以先自行设置页宽等参数来放更多内容。
但是以后交final version时,势必要改。所以为了避免重复劳动,最好一开头就严格使用一定的标准
特别是对于bibtex的item,每个entry最好都严格按照格式输入好,不然后面改起来很辛苦,经验之谈啊。

写作篇:
当一切格式均已制定好,所有工具准备就绪时,以后再写paper就方便多了。
当然,一开始总是生疏的,总要摸索多几次才能调整出自己最顺手的工作环境。
一般来说,我个人的风格是先做好实验再撰写文章,这样写起来比较得心应手,文思泉涌。
其实写这种文章都有一定的套路可循,无非是那几大环节,我这里稍微写一下经验:
- title : 我没什么很多的经验,个人觉得一个formal又不哗众取宠,不太长又不太短的title适合我风格
- abstract : 很考验一个人的总结水平。基本上是整片文章的缩影。
- introduction : 很考验一个人的写作能力, 写得好的intro会让审稿人迅速把握中心思想, 不会看得烦.
- literature review : 介绍前人工作, 似乎不宜写得太长, 否则会占去太多篇幅, 有reviewer喜欢用这个来说你的contribution少
- methodology : 主要介绍自己的contribution, 我喜欢先在这里或之前的section里总结一下, 让人明了你究竟做了什么.
  然后再展开来描述你的工作的各个细节. 这里可以分几个不同的section来写, 一般我会用单独的一个secion来分析问题. 然后1-2个section来说明算法/方法.
- experimental result : 也是很重要的一个环节,用图表来证明自己方法的效率以及比起前人工作的优越性
- conclusion : 基本上就是再说一次,我喜欢加上future work

写好后,就是跟老板的互动反馈意见了。虽然很简单,但是我很喜欢这种style。
基本上论文都是我自己写的,所以很考验人的写作能力,虽然辛苦,但是也算是一种学习过程。
然后通过老板的反馈意见修改文章时,也会发现自己的不足,就这样修改个3-5次,基本上就得到了能投的文章。
当然我还希望有peer review,可惜实验室没人有空帮我看 :(

附注1:搭建一個合适的jabref+bibtex工作环境
之前我的方法很山寨:一个paper开一个文件夹,里面放tex的src以及bibtex的.bib文件。
这样的话,不同的paper往往会使用同一个bib,管理起来很不方便(比如A paper里面的bib改了,其他也需要更新)。
现在的解决方法是:
专门用一个文件夹来装paper + .bib,要完成这个任务具体需要三个步骤:
1. 假设这个文件夹叫做allpapers,则建立一个allpapers/bibtex 文件夾,把.bib放里面
2. 设置jabref论文的搜索路径,比如我简单起见,把所有paper都塞到bibtex文件夹里,则jabref搜索路径设为当前文件夹"."即可。
3. 设置tex发行版的搜索路径(search path),比如CTeX可以设置miktex的option,在root里面加上allpapers文件夹。
(发觉miktex搜索的路径貌似只能是allpapers/bibtex,而不是allpapers本身....所以之前把.bib放在bibtex文件夾里)

设置好后,用
initexmf -vu
更新数据库,用
findtexmf xxx.bib
测试是否能正确搜索到,如果可以则会打印出文件的路径。

这么下来,论文里面要引用这个.bib只需简单地用
\bibliography{xxx}
即可。
pdflatex、bibtex会在指定的目录下面搜索对应的bib文件,再也不用一个文件夹放一个bib了!

* 更理想的管理方法是,能把paper稍微分类,这样也许可以通过指定jabref的搜索路径为上一层目录解决。
比如allpapers/{bibtex, PL, CAD, OS}这种目录结构,管理起来会方便很多。

参考:
- http://www.haptonstahl.org/latex/work_bibtex.php
- http://www.fceia.unr.edu.ar/lcc/cdrom/Instalaciones/LaTex/MiKTex/doc/ch08.html

这里有一篇很好的jabref的使用指南

附注2:关于IEEETran BibTeX style以及参考文献引用规范
IEEETran BibTeX style file是用于生成符合IEEE规范的参考文献列表的BibTeX样式文件。
有很多种不同的样式,最常用的应该是IEEEtran.bst这个文件。
要使用它非常简单,只需在对应tex distro的<texmf/bibtex/bst文件里放好对应bst文件,
然后在tex src里面加入这句即可:
\biblilographystyle{IEEEtran}
\bibliography{IEEEabrv, mybibfile}

其中的IEEEabrv是一些会忆名字的缩写,以方便你后面快速引用,mybibfile是你的bibtex文件。
下面介绍一些重要的entry type(article,conference/inproceedings,book)以及一些注意事项。

1. journal article (@article)
由于example已经在document里面详细给出,这里不再赘述。
IEEE 鼓励在author里详细给出作者的名字,生成最后的reference时,bibtex会根据bst文件自动缩写姓名首字母等。
并且可以在超过一定数量的作者时,自动缩写成`et al.'
在title里面,大括号用于保持单词的大小写状态,因为bibtex会根据bst文件自动更改title里面的一些大小写。
journal的输入是一个缩写string,这样可以很方便地根据要求,在full name(IEEEfull.bib)与abbreviations之间更换。
月份的输入是三个字母的输入,这样可以使bibtex识别并自动格式化日期。

2. conference proceedings
@conference与@inproceedings是一样的,没有区别。
要注意的是,对于这种entry,IEEE把page number,volume number等放到日期的后面。

3. book
这个……没什么好说的。

4. electronic(IEEEtran.bst extension)
这是ieee bst里面的拓展。用于引用一些电子资源。
其中可以使用url域(其实是所有entry type都可以使用的)
bibtex会生成一个[online]. Available: + url的字符串以提供下载。

5. 未出版、待出版文章
使用@misc 这个类型,里面加上
note = "to be published"
来说明。
或者是在@article的year field里写上"submitted for publication"。

6. 控制开关
(具体做法请参考原文档。)我喜欢把CTLdash_repeated_names设为no
否则如果一个reference item后续的item作者相同,则会省略为一条横线。
估计很多人看不惯,但却是IEEE推荐的格式。
不过,在bib里面添加了
@IEEEtranBSTCTL{BSTcontrol,
  CTLdash_repeated_names  =  "no",
}
这个entry后,每次打开jabref会有warning,有点烦。

附注3: ACM要求直接给出所有bibitem,而不是使用bibtex
很简单,只需使用上述流程正常生成文件后,在得到的bbl文件里复制即可。因为bibtex的原理也是用latex来预处理bib文件得到最终的tex代码,然后再包含进tex文件重新编译的。参考自这里

1 comment:

Meng said...

Great article. Many tricks are invaluable.

My environment is

Win7: miktex + emacs + Makefile + Acrobat
GNU/Linux: texlive + emacs + Makefile + evince

texlive on GNU/Linux seems much faster than miktex on Windows. Don't know whether it owes to ext4 or texlive itself.

Besides jabref, I suggest mendeley (also cross platform), which is being used by a huge network of people. Its main advantage is to connect academic people together. Of course, you can import your jabref database file into Mendeley.

Btw, this comment is posted on my Ubuntu 9.10. I VPNed it!