LaTeX bst文件修改(以ieeetr.bst为例)

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~} 表示仅显示首字母且后面空一点距离

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值