我不仅使用 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 读取为评论。