I'm trying to write a patch for lineno, so that it's \lineref command creates links, when hyperref is loaded. The code below works except for the commented-out \lineref* version, which is not supposed to create a link. If I remove the comments from the \lineref* definition, \lineref* works, but it breaks the linking function of \pageref and the \lineref[]{} with an optional argument.
\documentclass{article}
\usepackage{lipsum,lineno,hyperref,suffix}\linenumbers
\makeatletter
% presence of modern LaTeX hook system since Oct 2020
\@ifundefined{DeclareHookRule}{
\PackageWarningNoLine{lineno}{%
pre 2020-10 LaTeX, no hook system: no hyperref lineref links}
}{\DeclareHookRule{begindocument/end}{lineno/hyperref}{after}{hyperref}
\DeclareHookRule{begindocument/end}{lineno/hyperref}{after}{lineno}
\AddToHook{begindocument/end}[lineno/hyperref]{% after hyperref/lineno
\@ifpackageloaded{hyperref}{%
\let\LN@orig@lineref\lineref
\let\LN@orig@pageref\pageref
%%% \@LN@linelabel == lineno internal called by \linelabel
\let\LN@orig@linelabel\@LN@linelabel
\gdef\@LN@linelabel#1{\hypertarget{#1}{\LN@orig@linelabel{#1}}}
\renewcommand*{\lineref}[2][0]{%
\hyperlink{#2}{\NoHyper\LN@orig@lineref[#1]{#2}\endNoHyper}%
}%
\renewcommand*{\pageref}[1]{%
\hyperlink{#1}{\LN@orig@pageref*{#1}}%
}%
% \WithSuffix{\newcommand*}\lineref*[2][0]{%
% \NoHyper\LN@orig@lineref[#1]{#2}\endNoHyper%
% }%
\WithSuffix{\newcommand*}\pageref*[1]{%
\LN@orig@pageref*{#1}%
}%
}{}% no changes without hyperref
}
}
\makeatother
\begin{document}\noindent%
Line: \lineref{line:test}\quad\lineref*{line:test}\\
page: \pageref{line:test}\quad\pageref*{line:test}\\
Line 0 offset: \lineref[0]{line:test}\\
Line 1 offset: \lineref[1]{line:test}\\
page\_old: \pageref{sec:foobar}\quad\pageref*{sec:foobar}
\lipsum[1]\linelabel{line:test}
\section{foobar}\label{sec:foobar}
\end{document}
As a bonus, does anyone have an idea how to write this patch in such a way that it works on older LaTeX distributions without DeclareHookRule?