BibTeX 会在其输出的 .bbl 文件中进行换行。我该如何关闭或调整它?它会在参考书目中带有空格的长 URL 内换行,导致它们停止工作。
这是一个 MWE。
\documentclass{article}
\usepackage[spaces,obeyspaces]{url}
\usepackage{hyperref}
\usepackage{filecontents}
\begin{document}
\begin{filecontents}{foo.bst}
ENTRY {
url
}
{}
{}
FUNCTION {misc}
{
"\url{" url "}" * * write$ newline$
"\par" write$ newline$
}
READ
ITERATE {call.type$}
\end{filecontents}
\begin{filecontents}{foo.bib}
@misc{key1,
url = "http://example.com"
}
@misc{key2,
url = "http://example.com/this is a long url that contains more spaces than BibTeX can handle"
}
\end{filecontents}
\nocite{*}
\section{Bibliography}
\bibliographystyle{foo}
\bibliography{foo}
\end{document}
单击第一个链接会打开浏览器,但第二个链接则不会。
以下是它输出的 .bbl 文件的行号版本:
1 \url{http://example.com}
2 \par
3 \url{http://example.com/this is a long url that contains more spaces than
4 BibTeX can handle}
5 \par
btxhak.pdf 声称“write$ 进行了合理的换行”……
答案1
BibTeX 被硬编码为在 80 个字符后出现空格时换行(旧版本甚至会换行没有空格,这会导致 URL 出现问题)。正如评论中提到的,URL 中的空格在任何情况下都是无效的,因此应将其转换为%20
。您能做的最好的事情是编写一个 BibTeX 函数,故意在您选择的位置换行,但这取决于您认为什么是可以接受的。
One possible approach here would be to use a search-and-replace function to insert `%20`
\documentclass{article}
\usepackage[spaces,obeyspaces]{url}
\usepackage{hyperref}
\usepackage{filecontents}
\begin{document}
\begin{filecontents}{foo.bst}
ENTRY {
url
}
{}
{}
FUNCTION { not }
{
{#0}
{#1}
if$
}
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 {misc}
{
"\url{" url " " "%20" find.replace "}" * * write$ newline$
"\par" write$ newline$
}
READ
ITERATE {call.type$}
\end{filecontents}
\begin{filecontents}{foo.bib}
@misc{key1,
url = "http://example.com"
}
@misc{key2,
url = "http://example.com/this is a long url that contains more spaces than BibTeX can handle"
}
\end{filecontents}
\nocite{*}
\section{Bibliography}
\bibliographystyle{foo}
\bibliography{foo}
\end{document}
使用来自的代码驯服野兽。