1.将参考文献中作者和题名以", "分割改为以". "
FUNCTION {output.nonnull}
{ 's :=
output.state mid.sentence =
{ ", " * write$ }
{ output.state after.quote =
{ " " * write$ }
{ output.state after.block =
{ add.period$ write$
newline$
"\newblock " write$
}
{ output.state before.all =
'write$
{ output.state after.quoted.block =
{ write$
newline$
"\newblock " write$
}
{ add.period$ " " * write$ }
if$
}
if$
}
if$
}
if$
mid.sentence 'output.state :=
}
if$
s
}
将第四行改为
{ ". " * write$ }
或者
{ add.period$ " " * write$ }
其中add.period$就是添加"."
2.超过3个作者自动使用et al代替,而不用去bib中改成and others
将
FUNCTION {format.names}
{ 's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
nameptr #1 >
{ namesleft #1 >
{ ", " * t * }
{ numnames #2 >
{ "," * }
'skip$
if$
t "others" =
{ " {\em et~al.}" * }
{ " and " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
改为
FUNCTION {format.names}
{ 's :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr "{f~}{vv~}{ll}{, jj}" format.name$ 't :=
nameptr #1 >
nameptr #3
#1 + =
numnames #3
> and
{ "others" 't :=
#1 'namesleft := }
'skip$
if$
{ namesleft #1 >
{ ", " * t * }
{ numnames #2 >
{ "," * }
'skip$
if$
t "others" =
{ " {\em et~al}" * }
{ " and " * t * }
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
大致意思就是先判断已读取的作者是否达到3个,达到了后面的不读取了,用et al代替。
为了看懂这个代码可以去看一下GBT7714-2005NLang.bst中的相关注释,我截取了一段
FUNCTION {format.names.for.non.peer.review} {
% 初始化
's := % s := author域
#1 'nameptr := % nameptr 是姓名指针,初始化为 1
s num.names$ 'numnames := % 利用 num.names$ 获得 s 中的作者数量存入 nameptr
numnames 'namesleft := % 未处理的姓名数 namesleft := numnames
% 循环处理所有姓名
{ namesleft #0 > } % if namesleft > #0 (还有姓名没有格式化)
{ s nameptr % 选择第 nameptr 个姓名
name.format.string % 按 name.format.string 的格式排版
format.name$ % 调用 format.name$
% language empty$
% { "u" change.case$ } % 如果不是语言为空, 做大写转换
% { skip$ }
% if$ % <language 判断结束>
remove.period % 并删除缩写符号'.'
't := % 格式化后的姓名暂存于 t
nameptr #1 >
{ nameptr max.num.names.before.forced.et.al #1 + =
{ "others" 't := % 如果当前作者的序数已经超出了最大列显作者数
#1 'namesleft := } % 则置未处理姓名数为#1, 以便跳出循环
{ skip$ } % 如果作者序数在允许范围内, 则跳过
if$ % <et al 判断结束>
bbl.comma * % 添加逗号
namesleft #1 > % 若当前姓名不是最后一个
{ t * } % 显示当前姓名
{ t "others" = % 若当前姓名是最后一个且后面有略去的姓名
{ bbl.etal * } % 添加", et~al"或",等"
{ t * } % 如果没有略去姓名,以句点结束
if$ % <others 判断结束>
}
if$ % <namesleft 判断结束>
}
{ t } % 如果是第一个作者, 直接将排版后的姓名压栈
if$
nameptr #1 + 'nameptr := % 姓名指针加 1
namesleft #1 - 'namesleft := % 剩余姓名数减 1
}
while$
}
3.顺便说明一下作者名字相关的知识,f代表first name,v代表von,l代表last name,j代表Jr
{ff}表示first name正常打出,不省略
{f}表示仅显示首字母
{f~} 表示仅显示首字母且后面空一点距离