如何最好地重新定義 \includegraphics 指令?

如何最好地重新定義 \includegraphics 指令?

我正在嘗試重新定義\includegraphics命令以添加周圍代碼以使用silence包隱藏警告。

到目前為止,我有以下 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}

除了\includegraphics\subfloat.我在 中收到以下錯誤\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}}
                                                  \\

我在這裡缺少什麼?

如果有一種更簡單的方法來執行重新定義那就太好了。

答案1

不需要重新定義,這不會出現錯誤:

在此輸入影像描述

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

MWE編輯後編輯加入`silence包用法:

我想不出為什麼你應該禁用警告,但如果你確實讓\includegraphics解析它的參數並將其添加到內部命令周圍。

\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

答案2

我不確定你想抑制什麼警告,但你選擇的方式相當複雜和脆弱(這就是 失敗的原因\subfloat)。

這是一個使用xparse它使檢查可選參數變得非常容易的版本。我還添加了一個不執行“啟用/禁用過濾器”命令的+變體(如果您需要兩者,請在之前指定)。*

另請注意,使用 時graphicx,不支援使用兩個可選參數指定邊界框,因此無需檢查兩個可選參數。

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

相關內容