关闭 .bbl 文件内的文本换行

关闭 .bbl 文件内的文本换行

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}

使用来自的代码驯服野兽

相关内容