
Ich versuche, den \includegraphics
Befehl neu zu definieren, um umgebenden Code hinzuzufügen und so Warnungen mithilfe des silence
Pakets auszublenden.
Bisher habe ich folgende MWE:
\documentclass{article}
\usepackage{graphicx}
\usepackage{subfig}
\usepackage{silence}
\usepackage{letltxmacro}
\WarningFilter[warning_to_hide]{latex}{File}
\makeatletter
\LetLtxMacro{\includegraphicsorig}{\includegraphics}
\def\includegraphicsnowarningstar{%
\@ifnextchar[%
{\includegraphicsnowarningstar@i}
{\includegraphicsnowarningstar@j}}
\def\includegraphicsnowarning{%
\@ifnextchar[%
{\includegraphicsnowarning@i}
{\includegraphicsnowarning@j}}
\def\includegraphicsnowarningstar@i[#1]{%
\@ifnextchar[%
{\includegraphicsnowarningstar@jjj[#1]}
{\includegraphicsnowarningstar@jj[#1]}}
\def\includegraphicsnowarning@i[#1]{%
\@ifnextchar[%
{\includegraphicsnowarning@jjj[#1]}
{\includegraphicsnowarning@jj[#1]}}
\def\includegraphicsnowarningstar@j#1 {\ActivateWarningFilters[warning_to_hide]\includegraphicsorig*{#1}\DeactivateWarningFilters[warning_to_hide]}
\def\includegraphicsnowarning@j#1 {\ActivateWarningFilters[warning_to_hide]\includegraphicsorig{#1}\DeactivateWarningFilters[warning_to_hide]}
\def\includegraphicsnowarningstar@jj[#1]#2 {\ActivateWarningFilters[warning_to_hide]\includegraphicsorig*[#1]{#2}\DeactivateWarningFilters[warning_to_hide]}
\def\includegraphicsnowarning@jj[#1]#2 {\ActivateWarningFilters[warning_to_hide]\includegraphicsorig[#1]{#2}\DeactivateWarningFilters[warning_to_hide]}
\def\includegraphicsnowarningstar@jjj[#1][#2]#3{\ActivateWarningFilters[warning_to_hide]\includegraphicsorig*[#1][#2]{#3}\DeactivateWarningFilters[warning_to_hide]}
\def\includegraphicsnowarning@jjj[#1][#2]#3 {\ActivateWarningFilters[warning_to_hide]\includegraphicsorig[#1][#2]{#3}\DeactivateWarningFilters[warning_to_hide]}
\renewcommand{\includegraphics}{%
\@ifstar
{\includegraphicsnowarningstar}
{\includegraphicsnowarning}}
\makeatother
\begin{document}
\begin{figure}[t]
\centering
\includegraphics{test.jpg}
\caption{This is a working test image.}
\end{figure}
\begin{figure}[t]
\centering
\subfloat[][First sub-figure]{\includegraphics{test.jpg}}\\
\subfloat[][Second sub-figure]{\includegraphics{test.jpg}}
\caption{Why doesn't this work?}
\end{figure}
\end{document}
Das funktioniert einwandfrei, außer wenn new \includegraphics
in verwendet wird \subfloat
. Ich erhalte die folgenden Fehler in \subfloat
:
! Argument of \includegraphicsnowarning@j has an extra }.
<inserted text>
\par
l.52 ...st sub-figure]{\includegraphics{test.jpg}}
\\
Runaway argument?
{test.jpg}
! Paragraph ended before \includegraphicsnowarning@j was complete.
<to be read again>
\par
l.52 ...st sub-figure]{\includegraphics{test.jpg}}
\\
Was übersehe ich hier?
Wenn es eine einfachere Möglichkeit zur Neudefinition gäbe, wäre das großartig.
Antwort1
Eine Neudefinition ist nicht notwendig, das funktioniert fehlerfrei:
\documentclass{article}
\usepackage{graphicx}
\usepackage{subfig}
\begin{document}
\begin{figure}[t]
\centering
\includegraphics[width=.7\linewidth]{example-image}
\caption{This is a working test image.}
\end{figure}
\begin{figure}[t]
\centering
\subfloat[][First sub-figure]{\includegraphics[width=.7\linewidth]{example-image}}\\
\subfloat[][Second sub-figure]{\includegraphics[width=.7\linewidth]{example-image}}
\caption{Why doesn't this work?}
\end{figure}
\end{document}
Bearbeiten, nachdem MWE bearbeitet hat, um „Silency-Paketnutzung“ hinzuzufügen:
Mir fällt kein Grund ein, warum Sie Warnungen deaktivieren sollten, aber wenn ja, lassen Sie \includegraphics
die Argumente analysieren und fügen Sie sie einfach um den internen Befehl herum ein.
\usepackage{silence}
\makeatletter
\let\oldGin@ii\Gin@ii
\def\Gin@ii[#1]#2{%
\ActivateWarningFilters[warning_to_hide]%
\oldGin@ii[{#1}]{#2}%
\DeactivateWarningFilters[warning_to_hide]}
\makeatletter
Antwort2
Ich bin nicht sicher, welche Warnungen Sie unterdrücken möchten, aber die von Ihnen gewählte Methode ist ziemlich kompliziert und fehleranfällig (was der Grund für den Fehler bei ist \subfloat
).
Hier ist eine Version xparse
, die die Überprüfung optionaler Argumente sehr einfach macht. Ich füge auch eine +
Variante hinzu (die vorher angegeben werden muss, *
wenn Sie beides benötigen), die die Befehle zum Aktivieren/Deaktivieren des Filters nicht ausführt.
Beachten Sie auch, dass graphicx
die Angabe des Begrenzungsrahmens mit zwei optionalen Argumenten bei nicht unterstützt wird. Es besteht also keine Notwendigkeit, zwei optionale Argumente zu überprüfen.
\documentclass{article}
\usepackage[margin=1cm]{geometry} % just to fit as much as possible
\pagestyle{empty} % page number is useless for the example
\usepackage{graphicx}
\usepackage{subfig}
\usepackage{silence}
\usepackage{letltxmacro}
\usepackage{xparse}
\LetLtxMacro{\includegraphicsorig}{\includegraphics}
\RenewDocumentCommand{\includegraphics}{ t+ s O{} m }{%
\IfBooleanF{#1}{\ActivateWarningFilters[warning_to_hide]}%
\IfBooleanTF{#2}{\includegraphicsorig*}{\includegraphicsorig}[#3]{#4}%
\IfBooleanF{#1}{\DeactivateWarningFilters[warning_to_hide]}%
}
\WarningFilter[warning_to_hide]{latex}{File}
\begin{document}
\begin{figure}[!htp]
\centering
\includegraphics[width=2cm]{example-image}
\caption{This is a working test image.}
\end{figure}
\begin{figure}[!htp]
\centering
\subfloat[][First sub-figure]{\includegraphics[width=2cm]{example-image}}\\
\subfloat[][Second sub-figure]{\includegraphics[width=2cm]{example-image}}
\caption{Why doesn't this work?}
\end{figure}
\begin{figure}[!htp]
\centering
\includegraphics+[width=2cm]{example-image}
\caption{This is a working test image.}
\end{figure}
\begin{figure}[!htp]
\centering
\subfloat[][First sub-figure]{\includegraphics+[width=2cm]{example-image}}\\
\subfloat[][Second sub-figure]{\includegraphics+[width=2cm]{example-image}}
\caption{Why doesn't this work?}
\end{figure}
\end{document}