向 IfFileExists 添加迭代层来检查每个图形路径

向 IfFileExists 添加迭代层来检查每个图形路径

我正在合作一个项目,该项目最初是从存储在服务器上的图像开始的。由于每个人访问该服务器的路径都不同,因此我利用\graphicspath主 tex 文件中的声明,以便每个人都可以访问这些文件。最近,人们已经开始离线工作,但仍希望文档能够编译。

有几道很好的题目演示了如何进行IfFileExists检查并用替代方案替换。遗憾的是,我还没有找到一个能够成功遍历指定图形路径的版本。 文件路径和名称都包含下划线和空格。 我不喜欢这个,但我还是坚持这个。

我在这里读到: https://tex.stackexchange.com/a/3132/69378一个非常明确的答案,当\includegraphics{<thegraphic>}被调用时它实际上会遍历每一个\graphicspath并用它进行检查\IfFileExists{<thepath><thegraphic>.pdf}

该函数位于下面的 MWE 中,即使文件存在(但在 graphicspath 指定的基础中),它也只会返回缺失的图形,因为我不小心忽略了一个事实,即传递给该函数的路径适用于\includegraphics并不意味着相同的迭代将适用于IfFileExists

我尝试转到 sty 文件graphicxgraphics但没有看到任何我认识的循环语法。

向这个包含请求的新命令添加一个循环来检查图形路径中的每个路径是否困难IfFileExists

注意:我采用 newcommand 方法,因为我无法获得此处提出的补丁: https://tex.stackexchange.com/a/39987/69378处理文件扩展名和空格。但可能花些时间让建议的补丁发挥作用会更好,因为它修补了已经迭代的命令。

\documentclass{article}
\usepackage{todonotes}
\usepackage{graphicx}
\usepackage{xparse}
\usepackage{caption}
\usepackage[format=hang,singlelinecheck=0,font={sf,small},labelfont=bf]{subfig}

\graphicspath{%
    {S://}
    {../../../}
}

%S:\latex\MWE_Tex-StackExchange\2016-04-25 missing figures

%https://tex.stackexchange.com/questions/75014/is-it-possible-to-make-a-reference-to-a-subfigure-to-appear-figure-2a-with-cle
\captionsetup[subfigure]{subrefformat=simple,labelformat=simple,listofformat=subsimple}
\renewcommand\thesubfigure{\Alph{subfigure}}
\DeclareDocumentCommand{\MyIncludeGraphics}{ O{} +m }
{%
    \IfFileExists{"#2"}
    {%
        \includegraphics[#1]{"#2"}%
    }{%
        \missingfigure[figwidth=7.0cm]{Missing "#2"}%
    }%
}
\makeatletter

\renewcommand{\missingfigure}[2][]{% modified from todonotes.sty
  \setkeys{todonotes}{#1}%
  \addcontentsline{tdo}{todo}{\@todonotes@MissingFigureText: \protect\detokenize{"#2"}}%
  \par
  \noindent
  \begin{tikzpicture}
    \draw[fill=\@todonotes@currentfigcolor, draw = black!40, line width=2pt]
    (-2, -2.5) rectangle +(\@todonotes@currentfigwidth, \@todonotes@currentfigheight);
    \draw (2, -0.3) node[right, text width=\@[email protected]] {\detokenize{#2}};
    \draw[red, fill=white, rounded corners = 5pt, line width=10pt]
    (30:2cm) -- (150:2cm) -- (270:2cm) -- cycle;
    \draw (0, 0.3) node {\@todonotes@MissingFigureUp};
    \draw (0, -0.3) node {\@todonotes@MissingFigureDown};
  \end{tikzpicture}\hfill
}
\makeatother
\begin{document}
\begingroup
    \begin{figure}[ht!]
    \subfloat{\label{fig:A}\MyIncludeGraphics[width=0.5\textwidth]{figure_A_On_S.jpg}}%
    \subfloat{\label{fig:B}\MyIncludeGraphics{example_image_b.jpg}}%
    \caption[CAPTION UNDER DEVELOPMENT Grin lens design and performance]{%
        FIGURE NOT FINAL - CAPTION UNDER DEVELOPMENT \\
    }
\end{figure}
\endgroup
\listoftodos
\end{document}

更新

下面的解决方案对于除带空格的文件名以外的所有实例都非常有效。

我想我已经尝试了所有我能找到的变量等的可能排列\detokenize"但都无济于事。在检查文件是否存在时,添加引号似乎会被逐字读取。

我已经加载了\usepackage[space]{grffile},但如果我理解它的工作原理,除非我使用 \includegraphics,否则这不会有帮助。除非我能找到一种方法来用我的新imagetest函数复制此代码,否则允许空格的修改将不起作用,感谢下面答案中的 Ulrike Fischer。

let\grffile@org@Ginclude@graphics\Ginclude@graphics
\renewcommand*{\Ginclude@graphics}{%
  \ifx\grffile@filenameencoding\@empty
  \else
    \ifx\grffile@inputencoding\@empty
      \expandafter\ifx\csname inputencodingname\endcsname\relax
        \expandafter\ifx\csname
            CurrentInputEncodingOption\endcsname\relax
        \else
          \let\grffile@inputencoding\CurrentInputEncodingOption
        \fi
      \else
        \let\grffile@inputencoding\inputencodingname
      \fi
    \fi
    \ifx\grffile@inputencoding\@empty
    \else
      \grffile@extendedcharstrue
    \fi
  \fi
  \ifnum0\ifgrffile@babel 1\fi\ifgrffile@extendedchars 1\fi>\z@
    \begingroup
      \ifgrffile@babel
        \csname @safe@activestrue\endcsname
        \edef~{\string~}%
      \fi
      \ifgrffile@extendedchars
        \grffile@inputenc@loop\^^A\^^H%
        \grffile@inputenc@loop\^^K\^^K%
        \grffile@inputenc@loop\^^N\^^_%
        \grffile@inputenc@loop\^^?\^^ff%
      \fi
      \expandafter\grffile@extchar@Ginclude@graphics
  \else
    \expandafter\grffile@Ginclude@graphics
  \fi
}

答案1

你确实想让你的问题难以阅读。你为什么要添加所有这些不必要的细节?如果你想测试图形是否存在,你可以尝试这个:(来自使用 \includegraphics 之前检查文件是否有效

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

\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

\newcommand\myincludegraphics[2][]{%
 \imagetest{#2}{\includegraphics[#1]{#2}}{\missingfigure{\detokenize{#2}}}}

\makeatother
\graphicspath{{test/}}

\begin{document}

\myincludegraphics{blub}

\myincludegraphics{test-convert}

\myincludegraphics{example-image-A.pdf}

\end{document}

相关内容