\patchcmd di Etoolbox non riesce a trovare il modello di ricerca a causa del pacchetto hyperref

Aug 22 2020

Uso la reportclasse e ho imparato da altre domande su questo sito (come Rimuovere la spaziatura tra le figure per capitolo in LoF ) come posso regolare la spaziatura tra le figure per capitolo in LoF. Vorrei cambiare il tradizionale

\addtocontents{lof}{\protect\addvspace{10\p@}}

nel file report.cls a

\addtocontents{lof}{\protect\addvspace{15\p@}}utilizzando questa patch:

\makeatletter
\patchcmd{\@chapter}%
  {\addtocontents{lof}{\protect\addvspace{10\p@}}}% <search>
  {\addtocontents{lof}{\protect\addvspace{15\p@}}}% <replace>
  {}{}% <success><failure>
\makeatother

Tuttavia, emettendo \tracingpatchesposso vedere quanto segue:

[debug] analyzing '\@chapter'
[debug] ++ control sequence is defined
[debug] ++ control sequence is a macro
[debug] ++ macro can be retokenized cleanly
[debug] -- search pattern not found in replacement text

Sto facendo qualcosa di sbagliato ? Non capisco perché \patchcmdnon riesco a trovare il codice specificato. Per la cronaca, ci sono altre 3 patch nel mio documento (che non modificano \@chapter) e funzionano tutte bene.

Modifica: durante la preparazione di un MWE, mi sono reso conto che il pacchetto hyperrefè il colpevole, poiché rimuoverlo risolve il problema.

\documentclass[12pt,twoside,openright]{report}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{microtype}

\usepackage{etoolbox}

\usepackage[pdftex,colorlinks,linkcolor=blue,citecolor=red]{hyperref}

%----------------------- Patch -----------------------
\tracingpatches
\makeatletter
\patchcmd{\@chapter}%        
  {\addtocontents{lof}{\protect\addvspace{10\p@}}}% <search>
  {\addtocontents{lof}{\protect\addvspace{15\p@}}}% <replace>
  {}{}% <success><failure>
\makeatother
%-----------------------------------------------------


\begin{document}
\listoffigures
\chapter{A chapter}
\begin{figure}\caption{A figure}\end{figure}
\begin{figure}\caption{A figure}\end{figure}
\chapter{A chapter}
\begin{figure}\caption{A figure}\end{figure}
\begin{figure}\caption{A figure}\end{figure}
\appendix
\chapter{A chapter}
\addtocontents{lof}{\protect\addvspace{10pt}}%
\begin{figure}\caption{A figure}\end{figure}
\begin{figure}\caption{A figure}\end{figure}
\end{document}

C'è un modo per risolvere questo problema ? Devo continuare a caricare il hyperrefpacco.

Risposte

3 moewe Aug 22 2020 at 12:10

hyperrefdeve definire un gran numero di comandi interni per fare il suo lavoro.

In questo caso la definizione originale di \@chapterviene salvata in \Hy@org@chapterby hyperref, \@chapterviene quindi ridefinita per eseguire alcuni collegamenti e quindi chiamate \Hy@org@chapter.

Quindi la soluzione qui è applicare una patch \Hy@org@chapterinvece di \@chapterquando hyperrefviene caricato.

\documentclass[12pt,twoside,openright]{report}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{microtype}

\usepackage{etoolbox}

\usepackage[pdftex,colorlinks,linkcolor=blue,citecolor=red]{hyperref}

%----------------------- Patch -----------------------
\tracingpatches
\makeatletter
\patchcmd{\Hy@org@chapter}%        
  {\addtocontents{lof}{\protect\addvspace{10\p@}}}% <search>
  {\addtocontents{lof}{\protect\addvspace{15\p@}}}% <replace>
  {}{}% <success><failure>
\makeatother
%-----------------------------------------------------


\begin{document}
\listoffigures
\chapter{A chapter}
\begin{figure}\caption{A figure}\end{figure}
\begin{figure}\caption{A figure}\end{figure}
\chapter{A chapter}
\begin{figure}\caption{A figure}\end{figure}
\begin{figure}\caption{A figure}\end{figure}
\appendix
\chapter{A chapter}
\addtocontents{lof}{\protect\addvspace{10pt}}%
\begin{figure}\caption{A figure}\end{figure}
\begin{figure}\caption{A figure}\end{figure}
\end{document}

e

[debug] tracing \patchcmd on input line 16
[debug] analyzing '\Hy@org@chapter'
[debug] ++ control sequence is defined
[debug] ++ control sequence is a macro
[debug] ++ macro can be retokenized cleanly
[debug] ++ search pattern found in replacement text
[debug] ++ patching possible
[debug] == retokenizing macro now

In alternativa, puoi provare a inserire la tua patch prima hyperref di applicare le sue ridefinizioni.

\documentclass[12pt,twoside,openright]{report}

\usepackage{etoolbox}

%----------------------- Patch -----------------------
\tracingpatches
\makeatletter
\patchcmd{\@chapter}%        
  {\addtocontents{lof}{\protect\addvspace{10\p@}}}% <search>
  {\addtocontents{lof}{\protect\addvspace{15\p@}}}% <replace>
  {}{}% <success><failure>
\makeatother
%-----------------------------------------------------

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{microtype}

\usepackage[pdftex,colorlinks,linkcolor=blue,citecolor=red]{hyperref}



\begin{document}
\listoffigures
\chapter{A chapter}
\begin{figure}\caption{A figure}\end{figure}
\begin{figure}\caption{A figure}\end{figure}
\chapter{A chapter}
\begin{figure}\caption{A figure}\end{figure}
\begin{figure}\caption{A figure}\end{figure}
\appendix
\chapter{A chapter}
\addtocontents{lof}{\protect\addvspace{10pt}}%
\begin{figure}\caption{A figure}\end{figure}
\begin{figure}\caption{A figure}\end{figure}
\end{document}

Grazie a David Carlisle per averlo suggerito nei commenti .