我想修补\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
更适合此目的。