.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$ 函数时
写出来就是:
……
i 'f2
'f1 if$
或
…… i { 函数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
加载中,请稍候......