假设以下场景。一些用户需要完成一个宏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}
能够解释其为何有效的人可以对这篇文章进行评论。