如果文件丢失是否使用“默认”图形?

如果文件丢失是否使用“默认”图形?

我最近负责整理一份非常大的科学提案文件中的所有参考文献和标签。我的工作流程通常包括编译文档、查看“存在未定义的引用。“语句,然后在生成的 PDF 文件中搜索常见的““ 或者 ”??“”。

有时,这些缺失的参考资料与文本中使用的图表标签有关,而不是我们的参考书目中的某些内容。这让我感到疑惑:

是否可以使用“虚拟”或“默认”图形 \includegraphics 如果请求的文件丢失,会如何?

也许一个用例是,如果在 LaTeX 文档中有这样的命令\includegraphics{scaling.pdf},但是缩放.pdf在当前目录中不存在,因此我们使用现有的假人.pdf自动执行。我假设这涉及renewcommandincludegraphics命令,但是对于这种场景,应该如何执行呢?

答案1

尝试标准命令\IfFileExists。它有三个参数:文件名、如果存在该做什么、如果不存在该做什么:

\IfFileExists{scaling.pdf}{\includegraphics{scaling.pdf}}{\includegraphics{dummy.pdf}}

当然,你可以添加一些语法糖:

\newcommand{\includegraphicsmaybe}[1]{\IfFileExists{#1}{\includegraphics{#1}}{\includegraphics{dummy.pdf}}}

答案2

最后一个宏调用graphicx包括图像的是\Gin@ii。由于的结构\Gin@ii,可以修补此命令并暂时删除 LaTeX 错误产生功能。这是一个最小的例子:

enter image description here

\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\usepackage{graphicx}% http://ctan.org/pkg/graphicx
\newcommand{\noimage}{%
  \setlength{\fboxsep}{-\fboxrule}%
  \fbox{\phantom{\rule{150pt}{100pt}}}% Framed box
}

\makeatletter
\patchcmd{\Gin@ii}
  {\begingroup}% <search>
  {\begingroup\renewcommand{\@latex@error}[2]{\noimage}}% <replace>
  {}% <success>
  {}% <failure>
\makeatother

\begin{document}
\includegraphics[width=150pt]{tiger} \par
\includegraphics[width=150pt]{tigers}
\end{document}

在上面的例子中,该命令\noimage用于表示当不存在图像时生成的输出。例如,你可以\noimage使用

\newcommand{\noimage}{\includegraphics{dummy}}

如果您希望包含dummy而不是我的 150pt x 100pt 空矩形。 的重新定义\@latex@error(它接受 2 个参数,即吞噬并替换为\noimage)发生在组内,使其成为本地的,因此在\Gin@ii完成后会恢复原状。

\Gin@ii下面是在called中调用的最后一个宏\Ginclude@graphics;我已突出显示受 重新定义间接影响的部分\@latex@error

\def\Ginclude@graphics#1{%
  \begingroup
  \let\input@path\Ginput@path
  \filename@parse{#1}%
  \ifx\filename@ext\relax
    \@for\Gin@temp:=\Gin@extensions\do{%
      \ifx\Gin@ext\relax
        \Gin@getbase\Gin@temp
      \fi}%
  \else
    \Gin@getbase{\Gin@sepdefault\filename@ext}%
    \ifx\Gin@ext\relax
       \@warning{File `#1' not found}%
       \def\Gin@base{\filename@area\filename@base}%
       \edef\Gin@ext{\Gin@sepdefault\filename@ext}%
    \fi
  \fi
    \ifx\Gin@ext\relax
         \@latex@error{File `#1' not found}% <----------------------------- MODIFIED
         {I could not locate the file with any of these extensions:^^J% <-- MODIFIED
          \Gin@extensions^^J\@ehc}% <-------------------------------------- MODIFIED
    \else
       \@ifundefined{Gin@rule@\Gin@ext}%
         {\ifx\Gin@rule@*\@undefined
            \@latex@error{Unknown graphics extension: \Gin@ext}\@ehc
          \else
            \expandafter\Gin@setfile\Gin@rule@*{\Gin@base\Gin@ext}%
           \fi}%
         {\expandafter\expandafter\expandafter\Gin@setfile
             \csname Gin@rule@\Gin@ext\endcsname{\Gin@base\Gin@ext}}%
    \fi
  \endgroup}

这种方法的优点是您不必修改任何现有的宏定义,例如\includegraphics。可以扩展它以指示有问题(丢失)的文件。

答案3

根据其他答案,我想出了以下代码来忽略乳胶文档中丢失的图像文件。

这个答案相对于其他答案的优势在于,它处理了可选参数\includegraphics,它不需要 dummy.pdf 文件,也不需要更改\includegraphics文档正文中的任何命令。

% deal with missing images which are not directly included in the repository
\newcommand{\noimage}{%
  \setlength{\fboxsep}{-\fboxrule}%
  \fbox{\phantom{\rule{10pt}{10pt}}File missing\phantom{\rule{10pt}{10pt}}}% Framed box
}
\let\includegraphicsoriginal\includegraphics
\renewcommand{\includegraphics}[2][width=\textwidth]{\IfFileExists{#2}{\includegraphicsoriginal[#1]{#2}}{\noimage}}

相关内容