使 `\AtBeginDocument{\pretocmd{\label}{##1}...` 工作

使 `\AtBeginDocument{\pretocmd{\label}{##1}...` 工作

我想打補丁\label,涉及#1,似乎用hyperref,你必須在\begin{document}或使用之後這樣做\AtBeginDocument。 (程式碼hyperref也應該在沒有 的情況下工作。)所以這就是我嘗試過的,但它失敗了:

\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更適合此目的。

相關內容