6

I'm struggling with hyphenation of long URLs (using command \url{}).

Line breaking works fine in cases when URL is just part of line which doesn't fit to text area width. That means URL is hyphenated correctly if line starts with some text before URL - or if hyphenated URL is followed by other text which is also hyphenated.

Problem is in parts of URL which are at the line alone

  1. first line of very long URL

  2. middle lines of very long hyphenated URL

At screenshot there is visible that both cases overflowed the text area - case 1 is clearly visible, but also case 2 overflowed by few pixels.

In real document overflowed area is variable depending on contents which makes sometimes collisions with objects on the right side (images, ...).

enter image description here

How to hyphenate URLs correctly to avoid such overflows?

  • ideal solution is perfectly aligned block

  • but acceptable is also solution with underflowed line instead of overflowed (earlier line break instead of late)

I guess problem is mainly caused by non-proportional font and is fixed if other proportional text is present at the same line, but how to handle alone parts of long URLs?

\documentclass[a4paper]{book}

\usepackage{fontspec}

\usepackage{polyglossia}
\setmainlanguage{czech}

\usepackage{ulem}
\usepackage[unicode]{hyperref}
\def\UrlBreaks{\do{a}} % Force correct hyphenation for this example


\usepackage{pdfpages}

\usepackage{needspace}

\begin{document}

Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text.\newline
\url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}\newline
Some text before. \url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa} Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after.

\end{document}

Shorter MWE

\documentclass[a4paper]{book}

\usepackage{hyperref}
\def\UrlBreaks{\do{a}}

\begin{document}
Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text.\newline
\url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}\newline
Some text before. \url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa} Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after.
\end{document}

Edit 18-12-23: Additional issue

I've tried suggested solution:

\def\do#1{\appto\UrlSpecials{\do#1{\mathchar`#1 \mskip 0mu plus 1mu\penalty100}}}%
 \do\a

and initially everything was perfect. But I wasn't happy for long time :-) After I'd replaced the dummy URL with the real, document couldn't be even compiled - Number too big error, see details in screenshot.

Problem is only with combination "suggested solution" and "real URL". Old method and real URL is OK (only with wrong breaks, which was reason for this question) and suggested solution with dummy URL works also fine. It has definitely something to do with special characters in URL.

Full code:

\documentclass[a4paper]{book}

\usepackage{fontspec}

\usepackage{polyglossia}
\setmainlanguage{czech}

\usepackage{ulem}
\usepackage[unicode]{hyperref}

% Old method - no error, but issues with breaks
%\def\UrlBreaks{\do\-\do\/\do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9\do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j\do\k\do\l\do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t\do\u\do\v\do\w\do\x\do\y\do\z\do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L\do\M\do\N\do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X\do\Y\do\Z}

% New method - error for real URL (previous example with "aaa" works)
\def\do#1{\appto\UrlSpecials{\do#1{\mathchar`#1 \mskip 0mu plus 1mu\penalty100}}}
\do\-\do\/\do\0\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9\do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j\do\k\do\l\do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t\do\u\do\v\do\w\do\x\do\y\do\z\do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L\do\M\do\N\do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X\do\Y\do\Z

\usepackage{pdfpages}

\begin{document}

Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text.\newline
%\url{http://aaa.bbb.ccc/njrrjjriokf56opiyfl5ojiorij6m9h9r87vjvjytrjyiotryhjiothjvoi8jr8o7j8hohj8oj88jt6hj8ohjot6trhiothj8hj8ohitnhh8tr7t786ht76nvh6gtrhgoght6onbvgnhyg8o7hvntnvotr696yjvhopr76r}\newline
\url{http://www.portafontium.cz/iipimage/30063568/karlovy-vary-65\_0240-t?x=-45\&y=345\&w=927\&h=383}\newline

\end{document}

enter image description here

1
  • 1
    I have retagged your question, since XeLaTeX and MikTeX are not really responsible for this issue. I have also added a much shorter MWE that still reproduces the issue, but gets rid of unnecessary packages.
    – moewe
    Dec 23, 2018 at 9:47

3 Answers 3

2

You can use the xurl package:

\documentclass[a4paper]{book}

\usepackage{fontspec}

\usepackage{polyglossia}
\setmainlanguage{czech}
\usepackage{showframe}
\renewcommand{\ShowFrameLinethickness}{0.3pt}
\usepackage{ulem}
\usepackage{xurl}
\usepackage[unicode]{hyperref}

\usepackage{pdfpages}

\usepackage{needspace}

\begin{document}

Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text.\newline
\url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}\newline
Some text before. \url{http://abc.bbb.ccc/abcabcaaaaaaabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabca} Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after.

\end{document} 

enter image description here

4
  • 1
    essentially the same answer as the one by @Kurt, but his identifies a bug, fixes it, and he says he will report it. Dec 23, 2018 at 1:23
  • 1
    @barbarabeeton: I didn't see Kurt's answer and didn't know about the bug – I seldom have to type urls in my LaTeX documents. Thanks for the information!
    – Bernard
    Dec 23, 2018 at 10:26
  • didn't mean to imply that you had seen @Kurt's answer. apologies for giving that impression. (think of it this way -- if multiple people have been working in the same area, they tend to have similar experience, so the same answer can come simultaneously to more than one person. think of darwin and alfred russel wallace.) Dec 23, 2018 at 14:32
  • @barbara beeton: Bernard had really sent his answer earlier by few seconds than Kurt :-) I've responded to Kurt because his answer was the last on the page and I didn't want to scroll up :-) Now the answers are reordered by their evaluation, so it seems that Bernard has responded later, but in fact, both answers were prepared in parallel and sent only few seconds after each other :-)
    – Joseph
    Dec 23, 2018 at 14:48
5

Just add the call of package xurl before package hyperref.

The following MWE

\documentclass[a4paper]{book}

\usepackage{fontspec}

\usepackage{polyglossia}
\setmainlanguage{czech}

\usepackage{ulem}
\usepackage[hyphens]{xurl} % <==========================================
\usepackage[unicode]{hyperref}

\usepackage{pdfpages}

\usepackage{needspace}


\begin{document}

Reference text. Reference text. Reference text. Reference text. 
Reference text. Reference text. Reference text. Reference text. 
Reference text. Reference text.\newline
\url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}\newline
Some text before. \url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa} Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after.

\end{document}

gives you:

enter image description here

I will inform the maintainer of xurl about this bug. Meanwhile you can use the following (not perfect, but better than nothing ...) code ( I corrected the code in \def: \def\UrlBreaks{\do\a}):

\documentclass[a4paper]{book}

\usepackage{fontspec}

\usepackage{polyglossia}
\setmainlanguage{czech}

\usepackage{pdfpages}
\usepackage{needspace}
\usepackage{ulem}
\usepackage{showframe}

%\usepackage{xurl} % <==========================================
\usepackage[unicode]{hyperref}
\def\UrlBreaks{\do\a}


\begin{document}

Reference text. Reference text. Reference text. Reference text. 
Reference text. Reference text. Reference text. Reference text. 
Reference text. Reference text.

\url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}

Some text before. \url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa} Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after.

\end{document}

with the result:

enter image description here

4
  • Looks fine, but what is the additional "13579/:" in the screenshot?
    – Joseph
    Dec 22, 2018 at 23:23
  • 1
    @Joseph Ups, I did not saw that. I will check ...
    – Mensch
    Dec 22, 2018 at 23:28
  • It's also in Bernard's example above :-) Maybe some debug feature?
    – Joseph
    Dec 22, 2018 at 23:29
  • 1
    The numbers are due to a bug in xurl. It is adding all numbers to \UrlSpecials, but without a second argument and that breaks them. Dec 22, 2018 at 23:42
5

url's are not hyphenated. They are broken. As they are actually set in math the parts are blocks of quite fix width, this makes it sometimes difficult to fill up a line. You can add a bit stretchability after the a to avoid the problem:

\documentclass[a4paper]{book}

\usepackage{fontspec}

\usepackage{polyglossia}
\setmainlanguage{czech}

\usepackage{ulem}
\usepackage[unicode]{hyperref}
%\def\UrlBreaks{\do{a}} %
% some stretchability:
\def\do#1{\appto\UrlSpecials{\do#1{\mathchar`#1 \mskip 0mu plus 1mu\penalty100\relax}}}%
 \do\a

\begin{document}

Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text. Reference text.\newline
\url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}\newline
Some text before. \url{http://aaa.bbb.ccc/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa} Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after. Some text after.

\end{document} 

enter image description here

5
  • 2
    This seems to be the same issue as tex.stackexchange.com/q/466114/35864. I'm wondering if it would make sense to add that tiny bit of stretchable space to the biblatex definitions, since the result with one letter overflowing into the margin is visually unpleasant and also quite unintuitive when one looks at it for the first time: At least I would have thought that moving the protruding a into the next line would not have left the first line terribly underfull...
    – moewe
    Dec 23, 2018 at 9:51
  • 3
    @moewe yes. probably it would be a good idea to add it. In older times when file, folder and url names were rather short the stretchable space \Urlmedskip after the slash was enough but now it often leads to problems that there is not more in other places. Dec 23, 2018 at 11:20
  • 1
    Thanks you for the comment. have opened github.com/plk/biblatex/issues/850 so I don't forger about it over the holidays.
    – moewe
    Dec 23, 2018 at 11:39
  • I've tried suggested solution and initially everything was perfect. But I wasn't happy for long time :-) After I'd replaced the dummy URL with the real, document couldn't be even compiled - Number too big error. I've updated the initial question with more information.
    – Joseph
    Dec 23, 2018 at 14:43
  • 1
    There was a \relax missing after the penalty number, and so it picked up the number in the url. Dec 23, 2018 at 14:52

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .