¿Cuál es la mejor manera de redefinir el comando \includegraphics?

¿Cuál es la mejor manera de redefinir el comando \includegraphics?

Estoy intentando redefinir el \includegraphicscomando para agregar código circundante para ocultar advertencias usando el silencepaquete.

Hasta ahora tengo el siguiente 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}

\includegraphicsEsto funciona bien excepto cuando se usa new en el archivo \subfloat. Recibo los siguientes errores en \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}}
                                                  \\

¿Que me estoy perdiendo aqui?

Si hay una forma más sencilla de realizar la redefinición, sería genial.

Respuesta1

No es necesario redefinirlo, esto funciona sin errores:

ingrese la descripción de la imagen aquí

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

Edite después de que MWE haya editado para agregar `uso del paquete de silencio:

No se me ocurre ninguna razón por la que debas desactivar las advertencias, pero si permites \includegraphicsanalizar sus argumentos y simplemente agregarlos alrededor del comando interno.

\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

Respuesta2

No estoy seguro de qué advertencias desea suprimir, pero la forma que eligió es bastante complicada y frágil (que es la razón del error \subfloat).

Aquí hay una versión xparseque hace que la verificación de argumentos opcionales sea muy fácil. También agrego una +variante (que se especificará antes *si necesita ambas) que no ejecuta los comandos de “activar/desactivar filtro”.

Tenga en cuenta también que, con graphicx, no se admite la especificación del cuadro delimitador con dos argumentos opcionales, por lo que no es necesario marcar dos argumentos opcionales.

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

información relacionada