如何包含由用户宏设置路径的图像?

如何包含由用户宏设置路径的图像?

假设以下场景。一些用户需要完成一个宏ImagePath{},以便自动在文档的某个预定义位置包含图像。没有对其扩展名做出任何假设。下面的 MWE 编译失败并出现错误!LaTeX 错误:未找到文件“images/logo.png”。即使文件存在。

\documentclass{report}
\usepackage{graphicx}
\makeatletter
\def\ImagePath#1{\def\@ImagePath{#1}}
\def\printImagePath{\@ImagePath}
\makeatother
\ImagePath{images/logo.png}
\begin{document}
\IfFileExists{\printImagePath}{
    \includegraphics{\printImagePath}
}{
    File \texttt{\printImagePath} does not exist
}
\end{document}

令人惊讶的是,如果强加扩展名,例如 PNG,则不再出现编译错误:

\documentclass{report}
\usepackage{graphicx}
\makeatletter
\def\ImagePath#1{\def\@ImagePath{#1}}
\def\printImagePath{\@ImagePath}
\makeatother
\ImagePath{logo}
\begin{document}
\IfFileExists{\printImagePath.png}{
    \includegraphics{\printImagePath.png}
}{
    File \texttt{\printImagePath.png} does not exist
}
\end{document}

因此,有没有办法从用户那里获取完整的图像路径,无论扩展名是什么?

答案1

我不知道实施的细节,但据我所知,\includegraphics扩大了它的论点只有一次在尝试包含图像之前。(我假设,这是允许在文件名中使用活动字符等的副作用。)

如果您以这样的方式设计宏,使得所使用的宏\includegraphics立即包含图像路径,那么它就可以起作用。

\documentclass{report}

\usepackage{graphicx}

\def\ImagePath#1{\def\theimagepath{#1}}

\ImagePath{images/logo.png}

\begin{document}

\IfFileExists{\theimagepath}{
    \includegraphics[width=.8\textwidth]{\theimagepath}
}{
    File \texttt{\theimagepath} does not exist
}

\end{document}

答案2

我终于找到了解决方案(感谢此评论),但我不知道它是如何工作的:grffile在序言中加载包可以避免编译错误……

\documentclass{report}
\usepackage{graphicx}
\usepackage{grffile}
\makeatletter
\def\ImagePath#1{\def\@ImagePath{#1}}
\def\printImagePath{\@ImagePath}
\makeatother
\ImagePath{images/logo.png}
\begin{document}
\IfFileExists{\printImagePath}{
    \includegraphics{\printImagePath}
}{
    File \texttt{\printImagePath} does not exist
}
\end{document}

能够解释其为何有效的人可以对这篇文章进行评论。

相关内容