I would like to define a macro very similar to \url
, that accepts more or less arbitrary strings (including hashes/#
) and passes them to other commands (i.e., \href
, \url
, \nolinkurl
). I have tried to apply some other solutions (e.g., changing catcodes locally etc.), but failed. I would also like my new macro to be passable to other macros like \footnote
.
The following non-working MWE shows an implementation, taking arbitrary strings as inputs, converts them to escaped tex-compatible strings (by use of \tl_to_str:n
as an xparse command processor), and passes them along without errors. However, this completely breaks the meaning of the macros, which just output the escaped text (I don't really understand why).
Ideally, the macro would even detect hashes and escape them when passing the respective argument to \href
, because that's required (but not for the original \url
).
\documentclass{article}
\PassOptionsToPackage{hyphens}{url}
\usepackage[hidelinks]{hyperref}
\usepackage{xparse}
\usepackage{letltxmacro}
\ExplSyntaxOn
\LetLtxMacro\oldurl\url
\RenewDocumentCommand\url{>{\tl_to_str:n}m>{\tl_to_str:n}g}{%
\IfNoValueTF{#2}{%
\oldurl{#1}%
}{%
\href{#1}{#2}%
}%
}
\ExplSyntaxOff
\setlength{\parindent}{0pt}
\begin{document}
\smallskip
\noindent\rule{\linewidth}{1ex}
\smallskip
url\hfill\hspace{0.6\linewidth}\url{https://www.yahoo.com/break/#me}
\smallskip
2url\#1\hfill\hspace{0.6\linewidth}\url{https://www.yahoo.com/break-me/#please}{www.yahoo.com/break/me/please}
\smallskip
2url\#2\hfill\hspace{0.6\linewidth}\url{https://www.yahoo.com/break-me/please}{www.yahoo.com/break/me/#please}
\smallskip
2url\#3\hfill\hspace{0.6\linewidth}\url{https://www.yahoo.com/break-me/#please}{www.yahoo.com/break-me/#please}
\noindent\rule{\linewidth}{1ex}
footnote: \footnote{\url{https://www.yahoo.com/break-me/#please}{www.yahoo.com/break-me/#please}}
\end{document}
pdflatex
from TL 2016. Do you get any errors? I have also attached a screenshot of the output.Illegal parameter number in definition of \Hy@tempa.