ConTeXt 对参考文献的处理

LiYanrui posted @ Dec 17, 2009 09:38:25 PM in Dream of TeX with tags tex MkIV ConTeXt 参考文献 , 10274 阅读

本文讲述 ConTeXt 处理参考文献的基本过程。

ConTeXt 早先可通过 Taco Hoekwater 写的一个第三方模块 t-bib 与 bibtex 程序的“对接”,从而实现对参考文献的处理,再后来 t-bib 模块被 ConTeXt 内部集成了。

ConTeXt 与 bibtex 的协同工作过程如下图所示:

    

下面我们按照这幅图的指示旅行一番(剧透:这其实是一个比较漫长的骗局,看到最后就明白了)。

ConTeXt 文稿准备与“仅一次编译”

看 test.tex 文件:

\usemodule[zhfonts]
\usezhfonts[rm,11pt]

\setupbibtex[database=ref]

\starttext

\chapter{河蟹}

有的人,深知“防民之口,甚于防川\cite[左丘失明]”的道理,所以他们不再修堤防川,
只是往河中放了一些螃蟹。老百姓在河边吐口水的时候,螃蟹就伸出丑陋的爪子让他们闭嘴……

\completepublications
\stoptext

上述行号为 01 和 02 的代码,分别表示在 ConTeXt 文稿里加载了一个叫做 zhfonts 的模块并且为文稿设定了默认的中文字体。这个 zhfonts 模块可以从 http://github.com/liyanrui 上得到,具体说明见:http://bbs.ctex.org/viewthread.php?tid=55082

行号 04 的代码,表示将一个名为 ref.bib 的文件(与 test.tex 同一目录)作为 bibtex 的“数据库”,至于这份文件的具体内容,等一下在下文就出现了。

行号 10 的代码,表示在 ref.bib 数据库中引用键值为“左丘失明”的文献。

行号 13 的代码,表示在文章的最后页面中显示参考文献列表。

好了,现在可以公布 ref.bib 文件的内容,如下:

@book{左丘失明,
        author = "左丘明",
        title = "国语",
        publisher = "春秋鲁国历史出版社",
        address = "中国山东省曲阜附近",
        year = "BC450",
}

现在,ConTeXt 文稿已经准备好了,下面就开始“仅一次编译”:

$ context --once test

经过“仅一次编译”过程后,会生成 test.aux 文件(先不要去看都生成了哪些文件,只需要关心有没有 test.aux 即可),这份文件的内容如下:

\citation{*}
\bibstyle{cont-no}
\bibdata{ref}

\citation 的功能,我不清楚。

\bibstyle 的功能就是告诉 BibTeX 要使用 cont-no.bst 这个样式文件,该文件可以协助 BibTeX 实现 .bib 文件向 .bbl 文件转换。cont-no.bst 是 ConTeXt 默认设定的样式文件,除此之外,ConTeXt 还提供了另外三种样式文件——cont-ab.bst, cont-au.bst 和 cont-ti.bst。可以在 \setupbibtex 控制序列的参数中进行样式文件切换,例如切换为 cont-ab.bst:

\setupbibtex[database=ref,sort=ab]

\bibdata 的功能就是告诉 BibTeX 要对哪个 .bib 文件进行格式转换。

BibTeX 在干什么?

BibTeX 的主要工作就是根据 .aux 文件找到要进行格式转换的 .bib 文件,然后基于 .bst 文件的指示,将 .bib 文件转换为 .bbl 文件。这个 .bbl 文件是由 ConTeXt 控制序列构成的,它所对应的文献条目内容与 .bib 文件中的定义相一致。也就是说 BibTeX 只是一个翻译,将 .bib 文件中所定义的文献信息翻译为 ConTeXt 能听懂的“语言”。对于 LaTeX 而言,BibTeX 的工作就是将 .bib 翻译为 LaTeX 能听懂的“语言”

在已经具备 .aux 文件的情况下,针对上一节的 test.tex 与 ref.bib 的示例,现在可以使用:

$ bibtex test

将 ref.bib 文件转换为 test.bbl 文件。

现在,我们得到了 test.bbl 文件,内容如下:

\setuppublicationlist[samplesize={左50},totalnumber=1]

\startpublication[k=左丘失明,t=book,a={{左丘明}},y=C450,n=1,s=左50]
\author[]{}[]{}{左丘明}
\pubyear{BC450}
\title{国语}
\city{中国山东省曲阜附近}
\pubname{春秋鲁国历史出版社}
\stoppublication

\setuppublicationlist 是用来设定参考文献列表排版外观的,samplesize 参数也许是 .bst 文件控制 BibTeX 自作聪明的从参考文献信息中提取了一个简化的字串(默认是根据作者姓名和文献时间的信息提取的),并以它的长度作为参考文献列表项的自动悬挂(Autohang)长度。totalnumber 参数表示当前参考文献列表的长度。

\startpublication ... \stoppublication “封装”了一份参考文献条目,根据 .bib 文件即可理解其中各控制序列的含义,在此不作赘述。

再编译一次,就有了

最后,再运行一次 context 命令,对 test.tex 再编译一次:

$ context test

这时,ConTeXt 会自动加载 test.bbl 文件,它有一套默认的方式去对参考文献引用以及参考文献列表信息进行排版处理,并给出“原生态”的排版效果:

 

 

假作真时真亦假

上面说了那么多,其实都是我自以为是地去对 ConTeXt 对参考文献处理过程的拆解,曾经有一段时间,的确是需要分成那么多步骤才能完成对参考文献的处理。现在变的简单了,只要准备好 .bib 文件,直接运行:

$ context test

就可以将参考文献的处理过程融到 ConTeXt 文稿的编译过程中。

另外,如果不考虑参考文献数据被其它排版工具所用的情况,完全可以直接手写 .bbl 文件,这样就可以让 BibTeX 下岗了。其实,由 ConTeXt 控制序列构成 的 .bbl 文件的可读性还是很强的。

更详细的文档

是 Taco 当初为 t-bib 模块所写的文档,虽然有点过期了,但是副作用较小,见:http://modules.contextgarden.net/bibman


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter