\patchcmd von Etoolbox kann das Suchmuster aufgrund des Hyperref-Pakets nicht finden
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
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 .