在 BibTeX .bst 文件中使用字符替换

在 BibTeX .bst 文件中使用字符替换

我不仅使用 BibTeX 为我的 LaTeX 文档创建 bbl 文件,还用它来生成我所有文章的 HTML。在过去的 12 年里,它运行得非常好,但自从我决定添加 DOI 字段后,就遇到了一个小问题。

BibTeX,输出

(<small>doi:<a href=http://dx.doi.org/10.1051/jp2:1995145>10.1051/jp2:1995145</a></small>)

正如我编程的那样

FUNCTION {startdoienc}
{ duplicate$ empty$
    { pop$ "" }
    { " (<small>doi:<a href=http://dx.doi.org/" swap$ * ">" * }
  if$
}

FUNCTION {enddoienc}
{ duplicate$ empty$
    { pop$ "" }
    { "</a></small>)" * }
  if$
}

FUNCTION {article}
{ output.bibitem
  .... <cut out>
  new.block
  doi startdoienc  output
  doi enddoienc  pureoutput 
  new.block
  .... <cut out>
}

HTML 结果如下

A. Ajdari、F. Brochard-Wyart、C. Gay、PG de Gennes 和 JL Viovy拖拽在聚合物熔体中移动的系链 J. Phys. II 法国1995 5 491–495(doi:10.1051/jp2:1995145

其中 DOI 链接可点击。

但是,有些期刊(例如 J. Polym. Sci. B: Polym. Phys.)的 DOI 中包含一些字符,需要进行转义才能成为有效的 URL:<、> 和 #。例如:

10.1002/(SICI)1099-0488(19990701)37:13<1449::AID-POLB11>3.0.CO;2-T

问题:是否可以编写 BibTeX 程序来替代,例如“<“ 经过 ”%3c“然后才输出它?

答案1

使用 BibTeX 可以进行搜索和替换。优秀的驯服野兽建议

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

STRINGS{replace find text}
INTEGERS{find_length}
FUNCTION{find.replace}
{ 'replace :=
  'find :=
  'text :=
  find string.length 'find_length :=
  ""
    { text empty$ not }
    { text #1 find_length substring$ find =
        {
          replace *
          text #1 find_length + global.max$ substring$ 'text :=
        }
        { text #1 #1 substring$ *
          text #2 global.max$ substring$ 'text :=
        }
      if$
    }
  while$
}

所以你应该可以做类似的事情

FUNCTION {startdoienc}
{ duplicate$ empty$
    { pop$ "" }
    {
       " (<small>doi:<a href=http://dx.doi.org/" swap$ 
       "<" "\%3c" find.replace 
       * ">" *
    }
  if$
}

您可能还需要退出%以阻止其被 LaTeX 读取为评论。

相关内容