我想打補丁\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
更適合此目的。