\patchcmd von Etoolbox kann das Suchmuster aufgrund des Hyperref-Pakets nicht finden

Aug 22 2020

Ich benutze die reportKlasse und habe aus anderen Fragen auf dieser Seite gelernt ( z. B. Abstand zwischen Figuren pro Kapitel in LoF entfernen ), wie ich den Abstand zwischen Figuren pro Kapitel in LoF anpassen kann. Ich möchte das Traditionelle ändern

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

in der Datei report.cls zu

\addtocontents{lof}{\protect\addvspace{15\p@}}mit diesem Patch:

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

Durch die Ausgabe \tracingpatcheskann ich jedoch Folgendes sehen:

[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

Mache ich etwas falsch ? Ich verstehe nicht, warum ich \patchcmdden angegebenen Code nicht finden kann. Fürs Protokoll, es gibt 3 andere Patches in meinem Dokument (nicht modifizierend \@chapter) und sie funktionieren alle gut.

Bearbeiten: Beim Vorbereiten einer MWE wurde mir klar, dass das Paket hyperrefder Übeltäter ist, da das Entfernen das Problem löst.

\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}

Gibt es eine Möglichkeit, dies zu beheben? Ich muss das hyperrefPaket weiter laden.

Antworten

3 moewe Aug 22 2020 at 12:10

hyperrefmuss sehr viele interne Befehle definieren, um seine Sache zu erledigen.

In diesem Fall wird die ursprüngliche Definition von in by \@chaptergespeichert , dann neu definiert, um etwas zu verknüpfen und dann aufzurufen .\Hy@org@chapterhyperref\@chapter\Hy@org@chapter

Die Lösung hier ist also zu patchen, \Hy@org@chapteranstatt \@chapterwenn hyperrefgeladen wird.

\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}

gibt

und

[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

Alternativ können Sie versuchen, Ihren Patch einzufügen, bevor hyperref seine Neudefinitionen angewendet werden.

\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}

Danke an David Carlisle für den Vorschlag in den Kommentaren .