![biblatex 书目中的长 URL 的换行符?](https://linux22.com/image/275728/biblatex%20%E4%B9%A6%E7%9B%AE%E4%B8%AD%E7%9A%84%E9%95%BF%20URL%20%E7%9A%84%E6%8D%A2%E8%A1%8C%E7%AC%A6%EF%BC%9F.png)
我有一些很长的 URL,其中不包含特殊的“换行符”,例如“-”或“/”。我该如何自动断开这些 URL?
\documentclass{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[backend=biber]{biblatex}
\usepackage{url}
\usepackage{dingbat} % for \carriagereturn symbol
\makeatletter
\g@addto@macro{\UrlBreaks}{\UrlOrds}
\g@addto@macro{\UrlBreaks}{%
\do\/\do\d%
}
\makeatother
\begin{filecontents}{bachelorarbeit_lit.bib}
@ONLINE{java96,
author = {{Joe Black}},
title = {Foobar 1.0},
year = {1996},
month = {1},
url = {http://www.aaa.bb.cccc.dh/uploads/dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd.pdf},
urldate = {2011-03-02},
sortname = {Sun},
keywords = {www}
}
\end{filecontents}
\bibliography{bachelorarbeit_lit}
\begin{document}
Test \cite{java96}
\printbibliography
\end{document}
编辑
我不知道为什么,但它仍然不起作用。有没有自动中断长 URL 的选项。我不在乎中断在哪里,但它应该自动完成。即使我手动指定“中断字符”,它也不会起作用(如示例所示)。
答案1
在 的参考书目中\UrlBreaks
不需要黑客攻击。包使用并已添加了许多字符。某些字符类的断行由计数器控制。从\url
biblatex
biblatex
\biburlsetup
记录biblatex
, "4.10.3 用户定义的长度和计数器":
biburlnumpenalty
:如果将此计数器设置为大于零的值,biblatex
将允许使用包\url
中的命令格式化的所有字符串中的数字后换行url
。这将影响参考书目中的 URL 和 DOI。断点将受到此计数器值的惩罚。如果参考书目中的 URL 和/或 DOI 超出边距,请尝试将此计数器设置为大于零但小于 10000 的值(通常希望使用 9000 这样的高值)。将计数器设置为零会禁用此功能。这是默认设置。
biburlucpenalty
:与类似biburlnumpenalty
,只不过它会在所有大写字母后添加一个断点。
biburllcpenalty
:与类似biburlnumpenalty
,不同之处在于它会在所有小写字母后添加一个断点。
一个例子:
\RequirePackage{filecontents}
\begin{filecontents}{bachelorarbeit_lit.bib}
@ONLINE{java96,
author = {{Joe Black}},
title = {Foobar 1.0},
year = {1996},
month = {1},
url = {http://www.aaa.bb.cccc.dh/uploads/dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd.pdf},
urldate = {2011-03-02},
sortname = {Sun},
keywords = {www}
}
\end{filecontents}
\documentclass{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[backend=biber]{biblatex}
\usepackage{url}
%%% --- The following two lines are what needs to be added --- %%%
\setcounter{biburllcpenalty}{7000}
\setcounter{biburlucpenalty}{8000}
\bibliography{bachelorarbeit_lit}
\begin{document}
Test \cite{java96}
\printbibliography
\end{document}
答案2
还有另一种方法(更简短)来做到这一点:只需将下面的条目放在之前\begin{document}
:
\usepackage{url}
\def\UrlBreaks{\do\/\do-}
这使得您的定制(或要求!)参考书目样式(例如\bibliographystyle{IEEEtran}
)保持不变。
答案3
由于某种原因,接受的答案对我不起作用(可能是旧的软件包版本,我无法在工作中自行更新)。无论如何,因为我使用LuaLaTeX编译我的文档,这里是另一个解决方案(位于https://yingtongli.me/blog/2016/01/08/breaking-urls-anywhere-in-lualatex-even.html):
betterurl.lua
创建一个包含以下内容的文档:
function betterurl(text)
label = text:gsub(".", "%1\\allowbreak{}")
label = label:gsub("~", "\\textasciitilde")
label = label:gsub("&", "\\&")
label = label:gsub("/", "/")
label = label:gsub("-", "-")
url = text
tex.print("\\href{" .. url .. "}{" .. label .. "}")
end
并添加
\RequirePackage{luacode}
\luaexec{require("path/to/betterurl")}
\renewcommand{\url}[1]{\luadirect{
betterurl(\luastringN{#1})
}}
到你的序言中。请注意,你不需要添加文件扩展名.lua
。
结果如下:
答案4
所有这些对我都不起作用。
我的解决方案有效,但并不完美 - 有点像最后的手段(视觉上合适,但不是自动的)。
请注意,我使用了该bibtex
格式,这也可能是问题所在。
您可以直接在内部定义 URL references.bib
(或以您命名的任何 URL)。
您可能会有类似以下内容的内容:
@misc{a_very_consice_key,
title = {A very nice title},
urldate = {2023-11-19},
howpublished = {https://www.example.com/aaaaaaaaa/bbbbbbbbb/ccccccccc/ddddddddd},
}
做这个:
@misc{a_very_consice_key,
title = {A very nice title},
urldate = {2023-11-19},
howpublished = {\url{https://www.example.com/aaaaaaaaa/bbbbbbbbb/ccccccccc/ddddddddd}},
}
这已经起作用了......但可能会添加\texttt{}
不适合其余文献的格式(对我来说它不适合),所以我添加了一些内容。
在你的 packages.tex 中(或者你定义包的任何位置):
\usepackage{hyperref} % <- I had that
\usepackage{xurl} % <- I added that
没有它也可以工作(稍微改变断点 - 也许你需要它)
现在我们定义一个新命令(我在我的definitions.tex
)
\newcommand{\normalurl}[1]{%
\begingroup
\let\UrlFont\relax
\urlstyle{same} % use current font style
\url{#1}%
\endgroup
}
...并使用我们的新\normalurl
命令代替文件\url
内的命令.bib
:
@misc{a_very_consice_key,
title = {A very nice title},
urldate = {2023-11-19},
howpublished = {\normalurl{https://www.example.com/aaaaaaaaa/bbbbbbbbb/ccccccccc/ddddddddd}},
}
我完全不明白这为什么是个问题。也许更有经验的人可以从中创建一个不会中断的功能,\url
并且只会自动修复参考书目中的 URL?
URL 中确实不能有随机的破折号 ( -
)。特别是如果软件包在后面biber
添加了s。\href