38

I have some long URLs which doesn't contain special "line break characters" like "-" or "/". How can I automatically break these URLs?

\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}

edit

I don't know why but it still doesn't work. Is there an option to automatically break long URLs. I don't care where the break is but it should be done automatically. Even if I manually specify the "breaking character" it doesn't work (as the example shows).

59

Hacking \UrlBreaks is not needed for \url inside the bibliography of biblatex. Package biblatex uses \biburlsetup and has already added lots of characters. The breaking at some character classes is controlled by counters. From the documentation of biblatex, "4.10.3 User-definable Lengths and Counters":

biburlnumpenalty: If this counter is set to a value greater than zero, biblatex will permit linebreaks after numbers in all strings formatted with the \url command from the url package. This will affect URLs and DOIs in the bibliography. The breakpoints will be penalized by the value of this counter. If URLs and/or DOIs in the bibliography run into the margin, try setting this counter to a value greater than zero but less than 10000 (you normally want to use a high value like 9000). Setting the counter to zero disables this feature. This is the default setting.

biburlucpenalty: Similar to biburlnumpenalty, except that it will add a breakpoint after all uppercase letters.

biburllcpenalty: Similar to biburlnumpenalty, except that it will add a breakpoint after all lowercase letters.

An example:

\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}

Result

  • I use bibtex as the backend, but the given code does not work on mactex. In MikTex, I was able to compile. Any solution for mactex? – max Oct 30 '16 at 14:58
  • 1
    @max I just run the example using option backend=bibtex and using bibtex instead of biber and it just worked. I cannot test on MacTeX. But since you have a working and non-working case, you can investigate, compare versions, ... – Heiko Oberdiek Oct 30 '16 at 15:11
  • I manually updated the distribution and now it is working. Thanks :) – max Nov 8 '16 at 3:18
  • Nice solution. I was using the \sloppy (and similar) command but the problem was that it didn't insert a line break inside strings containing only letters which lead to a partial fix. – rbaleksandar Mar 9 '17 at 17:00
9

There is another way (SHORTER) of doing that: just put the entry below before the \begin{document}:

\usepackage{url}
\def\UrlBreaks{\do\/\do-}

This allows to have your customized (or required!) bibliography style (e.g. \bibliographystyle{IEEEtran}) unchanged.

  • 3
    The example URL doesn't contain suitably placed / or - on which to break, so it's not clear why this should work. – OJFord Jun 20 '17 at 12:11
0

For some reason the accepted answer did not work for me (maybe old package versions, which I can't update by myself here at work). Anyway, since I use LuaLaTeX to compile my document, here another solution (found at https://yingtongli.me/blog/2016/01/08/breaking-urls-anywhere-in-lualatex-even.html):

Create a document betterurl.lua with following content:

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

and add

\RequirePackage{luacode}
  \luaexec{require("path/to/betterurl")}
  \renewcommand{\url}[1]{\luadirect{
    betterurl(\luastringN{#1})
  }}

to your preamble. Note that you do not need to add the file extension .lua.

This is the result:

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.