鉴于各种情况,有时需要对参考文献中的作者名字列表进行一定的修改,
比如有的期刊要求当参考文献中的作者人数多于两人时只列出第一作者,其余作者使用et al.代替
当作者人数等于两人时,使用and连接两个作者的名字
当作者只有一个人时,正常输出。
有时根据文章篇幅限制,需要对参考文献的的长度进行精简,除了简写期刊或者会议的名称之外,
还可以通过缩减作者列表格式。
这里就以第一种情况要求的格式给出latex中的格式函数该如何定义
latex中定义参考文献格式的文件一般为.bst文件
其中有一个名为format.names的函数
其定义大概如下
FUNCTION {
format.names}
{
"""具体格式定义"""
}
在修改之前,先对原始bst文件进行拷贝,在拷贝文件中进行修改,以防万一
拷贝后,通过查找找到该函数的定义位置
然后将其定义为如下内容
FUNCTION {
format.names}
{
's := % 将作者名字列表赋值给局部变量 's'
#1 'nameptr := % 将数字 1 赋值给局部变量 'nameptr',用于迭代作者列表
s num.names$ 'numnames := % 计算作者数量并赋值给 'numnames'
numnames 'namesleft := % 将 'numnames' 赋值给 'namesleft',用于追踪还有多少作者需要处理
{
namesleft #0 > } % 开始一个 while 循环,只要 'namesleft' 大于 0,就执行循环体中的操作
{
s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := % 格式化当前作者的名字,赋值给局部变量 't'
nameptr #1 > % 检查当前处理的作者是否为第一个作者,即nameptr是否大于1
% 如果成立,即不是第一个作者,则执行如下代码
{
numnames #2 > % 如果作者数量大于 2,则在第一个作者的后面添加et al. 并将nameleft置为1
{
" \textit{et~al.}" *
#1 'namesleft :=}
% 否则表示只有两个作者,则使用and连接两个作者
{
" and " * t *}
if$
}
% 如果不成立,即是第一个作者,则保持t不变
't
if$ % 结束 if 判断
nameptr #1 + 'nameptr := % 增加 'nameptr' 以处理下一个作者
namesleft #1 - 'namesleft := % 减少 'namesleft' 表示还有多少作者需要处理
}
while$ % 结束 while 循环
}
以上函数可以实现当作者数目小于等于2时输出所有作者的名字,当作者数目大于2时,只输出第一个作者的名字,其余作者使用et al.替代。
需要注意的几点是
1) #1 并不是注释1,而是表示数字1
2)num.names$是latex内置函数,用于计算作者人数
3){ " and " * t } 其中表示连接符号,将“and”与t连接起来
4)#1 'namesleft := 表示赋值,将nameleft赋值为1
5)'t表示t本身