使 `\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更适合此目的。

相关内容