Thursday, January 7, 2016

Breaking URLs anywhere in (Lua)LaTeX (even in itemize, enumerate, adjustwidth, etc. environments)

\( \LaTeX \) is fantastic, but sometimes it does strange things, like breaking \urls only at certain points. Using tricks like this glorious \UrlBreaks hack, one can force URLs to break at any point, but for some reason, this does not work in environments like itemize, enumerate and adjustwidth, so doesn't work in BibLaTeX bibliographies.

To overcome this problem, one can manually insert \allowbreaks, but that seems a little s\allowbreaki\allowbreakl\allowbreakl\allowbreaky.

The solution: use Lua to do the hard work.

betterurl.lua
function betterurl(text)
    label = text:gsub(".", "%1\\allowbreak{}")
    
    label = label:gsub("~", "\\textasciitilde")
    label = label:gsub("&", "\\&") 
    
    -- insert other URL symbols here
    
    url = text
    
    tex.print("\\href{" .. url .. "}{\\texttt{" .. label .. "}}")
end


LaTeX preamble
\usepackage{luacode}

\luaexec{require("betterurl")}
\renewcommand{\url}[1]{\luadirect{
    betterurl(\luastringN{#1})
}}

Labels: , , , , ,