Qual a melhor forma de redefinir o comando \includegraphics?

Qual a melhor forma de redefinir o comando \includegraphics?

Estou tentando redefinir o \includegraphicscomando para adicionar código circundante para ocultar avisos usando o silencepacote.

Até agora tenho o seguinte 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}

Isso funciona bem, exceto onde o new \includegraphicsé usado no arquivo \subfloat. Eu recebo os seguintes erros no \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}}
                                                  \\

O que estou perdendo aqui?

Se houver uma maneira mais simples de realizar a redefinição, seria ótimo.

Responder1

Não há necessidade de redefinição, isso funciona sem erros:

insira a descrição da imagem aqui

\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 após a edição do MWE para adicionar `uso do pacote de silêncio:

Não consigo pensar em nenhuma razão para você querer desabilitar os avisos, mas se você fizer isso, deixe \includegraphicsanalisar seus argumentos e apenas adicioná-los ao 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

Responder2

Não tenho certeza de quais avisos você deseja suprimir, mas a forma que você escolheu é bastante complicada e frágil (que é o motivo da falha com \subfloat).

Aqui está uma versão xparseque torna muito fácil a verificação de argumentos opcionais. Também adiciono uma +variante (a ser especificada antes, *se você precisar de ambos) que não executa os comandos “ativar/desativar filtro”.

Observe também que, com graphicx, a especificação da caixa delimitadora com dois argumentos opcionais não é suportada, portanto não há necessidade de verificar dois argumentos opcionais.

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

informação relacionada