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