Hacer que `\AtBeginDocument{\pretocmd{\label}{##1}...` funcione

Hacer que `\AtBeginDocument{\pretocmd{\label}{##1}...` funcione

Quiero parchear \label, involucrando #1, y parece que con hyperref, tienes que hacerlo después \begin{document}de usarlo \AtBeginDocument. (El código hyperreftambién debería funcionar sin ). Así que esto es lo que intenté y falla:

\documentclass{article}
\usepackage{hyperref}
\usepackage{xpatch}

% Attempt 1 - does nothing
% \pretocmd{\label}{#1}{}{err}

% Attempt 3 - fails (err)
% \AtBeginDocument{\pretocmd{\label}{#1}{}{err}}

% Attempt 4 - fails (err)
\AtBeginDocument{\pretocmd{\label}{##1}{}{err}}

\begin{document}
    % Attempt 2 - works, inelegant
    % \pretocmd{\label}{#1}{}{err}

    Label name is \label{mylabel}.
\end{document}

Respuesta1

No veo una manera real de superar este problema del huevo y la gallina etoolbox(o xpatcheso es solo una envoltura de sus macros). Simplemente no puede usar #1en la parte de reemplazo \patchcmdo la parte análoga en \pretocmdo \apptocmdcuando el comando está en el argumento de otro comando, en este caso \AtBeginDocument.

Hay una salida con regexpatch:

\documentclass{article}

\usepackage{regexpatch}
\usepackage{hyperref}

\AtBeginDocument{%
  \makeatletter
  % \A is the start of string anchor, \cP\# is l3regex for 'parameter token'
  \regexpatchcmd{\label}{\A}{\cP\#1}{}{\err}%
  \makeatother
}

\begin{document}

Label name is \label{mylabel}.

\end{document}

Por otro lado, paquetes como showkeyso showlabelsson mucho mejores para este propósito.

información relacionada