So funktioniert `\AtBeginDocument{\pretocmd{\label}{##1}...`

So funktioniert `\AtBeginDocument{\pretocmd{\label}{##1}...`

Ich möchte patchen \label, wobei auch enthalten ist #1, und es scheint, dass Sie dies bei nach oder unter Verwendung hyperreftun müssen . (Der Code sollte auch ohne funktionieren.) Das hier habe ich also versucht, und es schlägt fehl:\begin{document}\AtBeginDocumenthyperref

\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}

Antwort1

Ich sehe keine wirkliche Möglichkeit, dieses Henne-Ei-Problem mit etoolbox(oder xpatchdas ist nur ein Wrapper über seinen Makros) zu lösen. Sie können einfach nicht #1im Ersetzungsteil von \patchcmdoder im analogen Teil von verwenden\pretocmd oder verwenden \apptocmd, wenn der Befehl im Argument eines anderen Befehls steht, in diesem Fall \AtBeginDocument.

Es gibt einen Ausweg mitregexpatch :

\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}

Auf der anderen Seite Pakete wieshowkeys oder showlabelsfür diesen Zweck viel besser geeignet.

verwandte Informationen