加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于修改.bst文件(bibtex模板)的几点说明

(2012-12-16 11:14:39)
标签:

latex

分类: 文本文档编辑
.bst文件是用bibtex处理参考文献*.bib文件时的输出格式模板
根据其说明文件 /usr/local/texlive/2007/texmf-dist/doc/bibtex/base/btxhak.pdf
可以对现有bst文件进行修改,以达到自己要求的输出格式。

bst文件是用一种“简单”的语言写成的,也就是“逆波兰式”的语法,对电脑来说简单,
完全是堆栈操作,可对人来说可没那么简单,反而是太不直观了!为此,这里对bst语法
中的几点做一些简单的说明。

注意:这绝对不是一个教程,如果你没研究过 btxhak.pdf 文件,这里写的你是看不懂的,
也不能指导你修改bst文件;这仅是对其中的几点做些说明,如此而已。

1.  如前所说,bst是逆波兰式语法,所有操作都是基于堆栈操作。

2.  栈中的元素在 btxhak.pdf 说明文件中称为 literal,这里就简单的称为元素。元素分为两种:变量和函数。变量使用前须声明,且只有整数和字符串型两种,整型常量以#开头,比如#3、#25等,字符串常量用双引号引起来,比如"goodluck"。函数是一种对堆栈中元素的操作,注意函数本身也是可以入栈的元素

3.  好多函数的执行过程是先把栈顶的若干个元素弹出,经过处理后再将结果入栈。注意:我是说“好多”函数是这么干的,但不是所有函数都这么做,有的并不是把结果入栈。

4. bst预先定义了37个内部函数,除了几个字符名称的函数(>、<、=、+、-、* 和 := )以外,其余30个内部函数的名称都是字符串组成,比如 pop、if、text.length、substring等,使用他们时必须在后面加上$字符以指明它们是内部函数,比如 pop$,if$等(自定义函数不需要加$)。

5. 写出的一个常量或变量,则表示将它们所代表的“值”入栈。写出的一个函数,则表明执行这个函数,但这个函数本身不入栈。

6. 变量名称前加上单引号“'”,表示将这个变量名入栈而不是变量代表的值入栈(或者理解为入栈的是这个变量的指针或地址)。
     比如:          tt  #3  'tt  :=         表示 tt=tt+3
     其操作过程是 1) 变量tt代表的值入栈,假设此时tt=5,那么入栈的元素是整数5;2) 整数常量3入栈;3) 遇见+函数,将栈顶的两个整数元素3和5弹出,将其相加,将结果8再入栈;4) 'tt 表示将变量tt的名称或指针入栈(用于赋值);5) :=函数将栈顶两元素弹出,且将第二个弹出的元素(8)赋值给第一个弹出的元素'tt。整个操作后,变量tt的值加了3, 栈顶未被修改

7. 函数名称前加上单引号“'”表示暂不执行这个函数,而是将其入栈,等其出栈时再决定是否执行。比如  'skip$ 是将内部函数 skip$(即一个空操作) 入栈 ,'myfunc是将自定义函数 myfunc 入栈,但暂不执行myfunc函数,而是等其出栈时再决定是否执行!对函数来说,与单引号等价的操作是用大括号{}将函数体括起来,相当于大括号内定义了一个无名函数,将这个无名函数入栈暂不执行,等其出栈时再决定是否执行。

8. 内部函数 if$ 和 while$ 的操作涉及栈中的函数元素,它们把栈顶的函数元素弹出栈,根据一定规则决定执行哪个函数。

9. if$ 函数。
     假设当前堆栈状态为:   栈底|……| i | f2 | f1 |
     当其遇到 if$ 函数时
     写出来就是:  ……     'f2  'f1  if$
     或          ……  { 函数f2的定义 }  { 函数f1的定义}  if$
    则执行顺序是:1) 先后弹出函数 f1 和 f2 以及整数i;2)判断i是否大于0,如果是的话就执行函数 f2,否则执行函数 f1。

10. while$函数。
     假设当前堆栈状态为:   栈底|……| f2 | f1 |
     当其遇到 while$ 函数时
     写出来就是:  ……     'f2  'f1  while$
     或             ……   
            { 函数f2的定义 } 
            { 函数f1的定义}  
             while$
    则执行顺序是:1)先后弹出函数 f1 和 f2;2) 执行f2,该过程可能修改栈顶;3) 弹出栈顶(应该是一个整数才对),比较它是否大于0,若大于0则继续,否则停止;4) 执行f1(也可能修改栈顶),然后跳转到2)继续。

11. 一段代码例子:定义一个函数,将文章名称(title)作为注释输出到*.bbl文件中。
        需要注意的问题:bibtex读取的title信息逻辑上是一个单行字符串,然而输出时却控制在每行最多79个字符,超过则自动换行,利用此特点及子字符串操作,将title分段循环输出,每行前加%作为注释。

INTEGERS { sstart  slen  totlen }
FUNCTION {myformat.title}
{
  title text.length$ 'totlen :=   
  totlen #1 + 'totlen :=
  #1   'sstart :=
  #78  'slen    :=
  {
     "%" title sstart slen substring$ * write$ newline$
     sstart slen + 'sstart :=
     sstart totlen <  %修改栈顶
  }
  %此时比较栈顶是否大于0,若是则继续,否则停止。
  {}  %空操作,可以用 'skip$ 来替换,但注意用 skip$ 是不行的!
  while$
}

12. 关于“特殊字符”以及 substring$, text.length$,和 text.prefix$
所谓“特殊字符”在BibTeX里是指:最顶级左大括号后紧跟着一个反斜杠(\),然后一直到到与之匹配的右大括号处为止的整个字符串。
比如  "{\LaTeX}" 和 "{\\\goodluck}" 都是一个特殊字符(注意,这里两边的引号"仅是字符串定界符)
而"{{\LaTeX}}则不是一个特殊字符,因为最顶级的左大括号后紧跟着的是另一个左大括号,而不是反斜杠\。
弄清了“特殊字符”的含义,再来看上面三个内部函数:
  (1) substring$
   在substring$函数看来,一个字符串里的所有字符都是一样的,没有什么是特殊的!因而在它看来,"{\LaTeX}"由8个字符组成,第1个是{,第2个是\,……,第8个是}。所以
                "{\LaTeX}" #2  #3 substring$
给出的结果是从第2个字符处起长度为3的子串,即 "\La"。
  (注意:这一点与《Tame the beast》中说的不一样,那里说是"\LaT",经过我的测试,并非如它所说)
  (2) text.length$
   计算字符串长度,但是这个长度并非上面substring$看到的长度,而是将“特殊字符”看成一个字符且去掉大括号后的长度。比如:
       "{\LaTeX}" 是一个特殊字符,由text.length$得到的长度是1
       "{{\LaTeX}}" 不是一个特殊字符,由text.length$得到的长度是6(大括号不计数)。
  (3) text.prefix$
    输出字符串的指定长度的前缀(子串),它和text.length$类似,将特殊字符看作一个字符,大括号不计数但是照样输出,比如:
    "{\LaTeX}abc"  的长度为3的前缀是 "{\LaTeX}ab",因为"{\LaTeX}"是一个特殊字符。
    "{{\LaTeX}}abc" 的长度为3的前缀是 "{{\La}}",注:大括号不计数但照样输出,计数的3个字符是"\La"。

  可见,text.length$ 与 text.prefix$ 搭配使用配合的很好,然而若与 substing$ 搭配使用,就很可能出现问题(当字符串中含有大括号或特殊字符时),因为它们理解的字符串长度是不一样的,尤其值得注意!

1,用latex写科技论文时,首先准备一份bib文件,文件头如:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5

@STRING(scn="Science") @STRING(nat="Nature") @string{ANN = "Annals
of Physics"} @string{LOWTEMP = "J. Low. Temp. Phys."} @string{IJMP =
"Int. J. Mod. Phys. B"} @string{MPL = "Mod. Phys. Lett. B"}
@string{NP = "Nucl. Phys. B"} @string{JPHYS1 = "J. Phys. Soc.
Japan"} @string{JPHYS2 = "J. Physique"} @string{JPHYSA = "J. Phys.
A"} @string{JPHYSB = "J. Phys. B"} @string{JPHYSC = "J. Phys. C"}
@string{JAP = "J. Appl. Phys."} @string{PLA = "Phys. Lett. A"}
@string{PLB = "Phys. Lett. B"} @string{PRL = "Phys. Rev. Lett."}
@string{PHYSF = "Phys. Fluids"} @string{PHYSR = "Phys. Rep."}
@string{PRA = "Phys. Rev. A "} @string{PRB = "Phys. Rev. B "}
@string{PRC = "Phys. Rev. C "} @string{PRD = "Phys. Rev. D "}
@string{PR = "Phys. Rev. "} @string{PROG = "Prog. Theor. Phys. "}
@string{PHYSS = "Phys. Scripta"} @string{PHYST = "Phys. Today"}
@string{RMP = "Rev. Mod. Phys."} @string{ZPHY = "Z. Phys. "}
@string{epl = "Europhys. Lett. "}


%%%%%%%%%%for DMS

@book{Chien2007,
    title = {Transition Metal-Doped Sb2Te3 and Bi2Te3 Diluted Magnetic Semiconductors },
    publisher = {A dissertation submitted in partial fulfillment of the requirements for
    the degree of Doctor of Philosophy(Applied Physics) in The University of Michigan},
    Author = {Chien, Yi-Jiunn},
    year = {2007}
}

@article{Chien2005,
  title={{Growth and transport properties of Sb2- xVxTe3 thin films on sapphire substrates}},
  author={Chien, Y.J. and Zhou, Z. and Uher, C.},
  journal={Journal of Crystal Growth},
  volume={283},
  number={3-4},
  pages={309--314},
  year={2005},
  publisher={Elsevier}
}

 

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

然后,在tex文件调用bib时,如

\bibliographystyle{Science}
\bibliography{QAHE}

其中,Science.bst文件,指定了生产references的书写格式(具体生产文件为bbl)。投稿时,当然可以把tex和bib文件一起投稿。也可以把bbl文件中的内容粘贴到tex中,并且注释掉前面两行,如

%\bibliographystyle{Science}
%\bibliography{QAHE}

2,特别是aps的bst文件,在引用时有多种引用方式,很是方便。如说明:

 % The \cite command functions as follows:
   \citet{key} ==>>                Jones et al. (1990)
   \citet*{key} ==>>               Jones, Baker, and Smith (1990)
   \citep{key} ==>>                (Jones et al., 1990)
   \citep*{key} ==>>               (Jones, Baker, and Smith, 1990)
   \citep[chap. 2]{key} ==>>       (Jones et al., 1990, chap. 2)
   \citep[e.g.][]{key} ==>>        (e.g. Jones et al., 1990)
   \citep[e.g.][p. 32]{key} ==>>   (e.g. Jones et al., p. 32)
   \citeauthor{key} ==>>           Jones et al.
   \citeauthor*{key} ==>>          Jones, Baker, and Smith
   \citeyear{key} ==>>             1990
 %---------------------------------------------------------------------

转自:http://blog.sina.com.cn/s/blog_643fd9d20100h88z.html

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有