赞
踩
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~} 表示仅显示首字母且后面空一点距离
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。