Заставляем `\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гораздо лучше подходят для этой цели.

Связанный контент