第二次尝试

第二次尝试

我知道如何检查给定的参数是否代表现有文件(请参阅这个问题)。

但是是否也可以检查该文件是否可以被包含\includegraphics

我想要实现的是一个命令

  • 如果可以的话,包含一个图像(并做更多的事情),但是
  • 包含某种信息框,如果参数没有指向(现有且有效的)图像文件,则将条目添加到“丢失图像列表”中。

答案1

第二次尝试

此处应进行与 相同的测试\includegraphics。这意味着如果图形/文件存在,则返回“是”如果扩展可以由引擎处理(那么tiger.eps会产生不同的结果pdflatex:(latex代码来自\Ginclude@graphicsgraphics.sty 中的定义)。

\documentclass[]{article}
\usepackage{graphicx}

\makeatletter
\newif\ifgraphicexist

\catcode`\*=11
\newcommand\imagetest[1]{%
 \begingroup
 \global\graphicexisttrue
   \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
       \global\graphicexistfalse
       \def\Gin@base{\filename@area\filename@base}%
       \edef\Gin@ext{\Gin@sepdefault\filename@ext}%
    \fi
  \fi
  \ifx\Gin@ext\relax
         \global\graphicexistfalse
    \else 
       \@ifundefined{Gin@rule@\Gin@ext}%
         {\global\graphicexistfalse}%
         {}%
    \fi  
  \ifx\Gin@ext\relax 
   \gdef\imageextension{unknown}%
  \else
   \xdef\imageextension{\Gin@ext}%
  \fi 
 \endgroup 
 \ifgraphicexist
  \expandafter \@firstoftwo
 \else
  \expandafter \@secondoftwo
 \fi 
 } 
\catcode`\*=12
\makeatother 

\begin{document}

\imagetest{tiger}{Yes, \imageextension}{No, \imageextension}

\imagetest{tiger.eps}{Yes, \imageextension}{No, \imageextension}

\imagetest{fail}{Yes, \imageextension}{No, \imageextension}

\imagetest{failxxx.eps}{Yes, \imageextension}{No, \imageextension}

\imagetest{bib.bib}{Yes, \imageextension}{No, \imageextension}
\end{document}

答案2

它需要文件的全名。您可以扫描日志文件以Imagefile获取所有丢失的图像文件。

\documentclass{book}
\usepackage{graphicx}
\newcommand\IG[2][]{\IfFileExists{#2}
  {\includegraphics[#1]{#2}}
  {\fbox{File #2 doesn't exist}%
   \message{Imagefile #2 doesn't exist^^J}}}% write a message into the log file

\begin{document}    
\IG{foo}

\IG[width=3cm]{tiger.pdf}

\end{document} 

在此处输入图片描述

答案3

在此处输入图片描述

\documentclass[preview,border=12pt,varwidth]{standalone}
\usepackage{graphicx}

\newwrite\writer
\immediate\openout\writer=missing.txt\relax

\newcommand\IG[2][]{\IfFileExists{#2}
  {\includegraphics[#1]{#2}}
  {\immediate\write\writer{\unexpanded{#2\newline}}}}


\begin{document}    
\IG{foo.ext}

\IG[width=3cm]{example-image-a.pdf}

\IG{goo.eps}

\IG{hoo.png}


\section*{Missing Graphics}
\immediate\closeout\writer
\input{missing.txt}

\end{document}

答案4

Ulrike 的出色回答不幸的是,对于现有的文件(如)不再起作用example-image-a,因为在过去几年中,该graphicx软件包得到了改进,其代码也发生了变化,例如,支持名称中的空格。按照 Ulrike 的想法,采用\Ginclude@graphics图形.sty,我尝试获取该命令的新版本\imagetest。我认为它值得分享。

\documentclass[]{article}
\usepackage{graphicx}

\graphicspath{{Figures/}}

\makeatletter
\newif\ifgraphicexist
\catcode`\*=11
\newcommand\imagetestNew[1]{%
    \begingroup
        \global\graphicexisttrue
        \ifx\detokenize\@undefined\else
            \edef\Gin@extensions{\detokenize\expandafter{\Gin@extensions}}%
        \fi
        \let\input@path\Ginput@path
        \set@curr@file{#1}%
        \expandafter\filename@parse\expandafter{\@curr@file}%
        \ifx\filename@ext\Gin@gzext
            \expandafter\filename@parse\expandafter{\filename@base}%
            \ifx\filename@ext\relax
                \let\filename@ext\Gin@gzext
            \else
                \edef\Gin@ext{\Gin@ext\Gin@sepdefault\Gin@gzext}%
            \fi
        \fi
        \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
                \global\graphicexistfalse
                \let\Gin@savedbase\filename@base
                \let\Gin@savedext\filename@ext
                \edef\filename@base{\filename@base\Gin@sepdefault\filename@ext}%
                \let\filename@ext\relax
                \@for\Gin@temp:=\Gin@extensions\do{%
                    \ifx\Gin@ext\relax
                        \Gin@getbase\Gin@temp
                    \fi}%
                    \ifx\Gin@ext\relax
                        \let\filename@base\Gin@savedbase
                        \let\filename@ext\Gin@savedext
                    \fi
                \fi
                \ifx\Gin@ext\relax
                    \global\graphicexistfalse
                    \def\Gin@base{\filename@area\filename@base}%
                    \edef\Gin@ext{\Gin@sepdefault\filename@ext}%
                \fi
        \fi
        \ifx\Gin@ext\relax
            \global\graphicexistfalse
        \else
        \@ifundefined{Gin@rule@\Gin@ext}%
            {\global\graphicexistfalse}%
            {}%
        \fi
        \ifx\Gin@ext\relax 
            \gdef\imageextension{unknown}%
        \else
            \xdef\imageextension{\Gin@ext}%
        \fi 
    \endgroup
    \ifgraphicexist
        \expandafter \@firstoftwo
    \else
        \expandafter \@secondoftwo
    \fi
}
\catcode`\*=12
\makeatother 

\begin{document}

    \imagetestNew{example-image-a}{Yes, \imageextension}{No, \imageextension}

    \imagetestNew{song.mp3}{Yes, \imageextension}{No, \imageextension}

    \imagetestNew{fail}{Yes, \imageextension}{No, \imageextension}

    \imagetestNew{failxxx.eps}{Yes, \imageextension}{No, \imageextension}

    \imagetestNew{bib.bib}{Yes, \imageextension}{No, \imageextension}

    Test using \texttt{graphicspath}:
    % The file "using-graphicspath.png" is in the "Figures/" folder in the directory of this file
    \imagetestNew{using-graphicspath.png}{Yes, \imageextension}{No, \imageextension}
    
    \imagetestNew{OtherFolder/using-graphicspath.png}{Yes, \imageextension}{No, \imageextension}

\end{document}

免责声明:我觉得\begingroup和之间的一些行\endgroup对于这个命令来说并不是真正需要的。不过,由于不确定删除它们是否会产生副作用,我决定保留它们。如果有人想改进上面的代码,那就继续吧!

编辑:

当尝试将以前的代码用于通过命令或文件路径指定的文件夹中的文件时,它实际上会崩溃\graphicspath。这个问题现在应该已经修复,并且 MWE 已经变得更加通用。

相关内容