`\AtBeginDocument{\pretocmd{\label}{##1}...` を動作させる

`\AtBeginDocument{\pretocmd{\label}{##1}...` を動作させる

\labelを含む にパッチを適用したいのです#1が、 を使用する場合は、 の後または を使用してhyperrefを実行する必要があるようです。( がなくてもコードは動作するはずです。) そのため、これを試してみましたが、失敗しました。\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}

答え1

etoolbox(または単にマクロをラッパーする)でこの鶏が先か卵が先かという問題を克服する実際の方法は見当たりません。コマンドが別のコマンドの引数内にある場合(この場合は) 、 の置換部分や の類似部分で を使用するxpatchことはできません。#1\patchcmd\pretocmd\apptocmd\AtBeginDocument

次のような方法があります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}

一方、showkeysや などのパッケージはshowlabelsこの目的にははるかに適しています。

関連情報