在 bst 文件中,检查变量是否包含字符串

在 bst 文件中,检查变量是否包含字符串

我有一个 bst 文件,它处理 bib 条目中的“协作”字段,如下所示:

@article{test,
      author         = "Smith, J.",
      title          = "The Foo Title",
      collaboration  = "BAR",
      journal        = "Stack",
      volume         = 0,
      pages          = "1-10",
      year           = 2013
}

产量:

J. Smith (BAR Collaboration), The Foo Title, Stack 0, 1–10 (2013).

这没有问题,但“协作”字段中已包含协作一词的条目除外。

我的问题是,是否有一种简单的方法可以修改下面的函数,以便仅在需要时添加“Collaboration”或“Collaborations”字符串?

修改后的函数需要不区分大小写,并且不区分单数/复数。

当前功能如下:

FUNCTION {format.collaboration}
{ collaboration empty$
    { "" }
    { collaboration num.names$ #1 >
        {" (" collaboration * " Collaborations)" * }
        {" (" collaboration * " Collaboration)" * }
    if$
    }
  if$
}

不幸的是,bibtex 的逆向波兰格式使得学习曲线非常陡峭,以至于驯服野兽文档及其示例并没有真正帮助我。

等我找到解决办法时,我本来可以更改我的所有 bib 条目以使其符合要求。但今后,如果有一个功能,我就不必再为此担心了,那就太好了。

谢谢!

答案1

我们使用string.lengthTame the Beast 中的函数,该or函数应该已包含在您的bst文件中。然后我们定义一个简单的搜索函数,用于测试一个字符串是否包含在另一个字符串中。使用这个函数,我们可以测试字段中的“collaboration”和“Collaboration” collaboration。请注意,我们不需要测试复数形式,因为搜索单数形式也会找到那些复数。

INTEGERS{ l }
FUNCTION{ string.length }
{
  #1 'l :=
  {duplicate$ duplicate$ #1 l substring$ = not}
    { l #1 + 'l :=}
  while$
  pop$ l
}

INTEGERS {find.length search.start search.end done}
STRINGS {find.string find.pattern}
FUNCTION {contains}
{
  'find.pattern :=
  'find.string :=
  find.pattern string.length 'find.length :=
  #1 'search.start :=
  find.string string.length find.length - #2 + 'search.end :=
  #0 'done :=
  { search.start search.end < }
  {
    find.string search.start find.length substring$ find.pattern =
      { 
        #1 'done :=
        search.end 'search.start :=%% stop searching
      }
      { #1 search.start + 'search.start := }
    if$
  }
  while$
  done
}

FUNCTION {format.collaboration}
{ collaboration empty$
    { "" }
    { collaboration num.names$ #1 >
        { " (" collaboration *
          collaboration "collaboration" contains
          collaboration "Collaboration" contains or
            { ")" * }
            { " Collaborations)" * }
          if$
        }
        { " (" collaboration *
          collaboration "collaboration" contains
          collaboration "Collaboration" contains or
            { ")" * }
            { " Collaboration)" * }
          if$
        }
    if$
    }
  if$
}

最后,我建议不要使用这些黑客技术,而是更改文件bib。BibTeX 只是用来格式化参考书目,而不是更改内容。如果您想使用其他样式,或切换到biblatex,那些不一致的 BibTeX 条目会再次困扰您。

相关内容