我正在为我的研究所制作一个 beamer 模板,用于\pgfdeclareimage
处理图像。我为不同的项目/实验/小组制作了很多图像和徽标,我将文件组织为
主 文件
夹 /-example.tex-beamerthememy.sty-art/myexample.pdf
现在的问题是如何声明图像。使用
\pgfdeclareimage[width=.5\paperwidth]{test}{art/myexample.pdf}
适用于与文件和目录.tex
位于同一文件夹中的文件。.sty
art
但是当我将.sty
文件和art
目录放在我的$TEXMFHOME
目录中(并将.tex
文件放在其他地方)时,我必须使用
\pgfdeclareimage[width=.5\paperwidth]{test}{myexample.pdf}
有没有一种方法可以声明在两种情况下都有效的图像?
\documentclass{beamer}
% works if .tex file is in the same directory as the .sty file and `testdir`
\pgfdeclareimage[width=.5\paperwidth]{test}{art/myexample.pdf}
% works if .sty file and `textdir` are in my lokal `texmf` folder
%\pgfdeclareimage[width=.5\paperwidth]{test}{myexample.pdf}
\begin{document}
\begin{frame}
\pgfuseimage{test}
\end{frame}
\end{document}
为了使示例简洁,我将示例\pgfdeclareimage
从.sty
文件移到了.tex
文件。如果你觉得这太简单了,我会添加一个 .sty 文件
答案1
简而言之,如果您向 传递的不仅仅是文件名(路径)pgfdeclareimage
,pdflatex
它就会在那里查找。否则,它会在完整的搜索路径中查找,该路径通常在环境变量中指定TEXINPUTS
。
因此,一个简单的解决方案就是添加到./art
,TEXINPUTS
然后只需使用文件名即可pdfdeclareimage
。
但是,由于这是一个可重复使用的模板,因此您必须考虑用户。例如,MikTeX 处理搜索路径的方式不同,许多用户很难摆弄环境变量,尤其是在使用某些 LaTeX-IDE 时。因此,为了易于使用,我会尝试在模板本身中处理这个问题:
\documentclass{beamer}
\newcommand{\samdeclareimage}[3][]{%
% first check local art directory to prefer it over TEXINPUTS paths
\IfFileExists{./art/#3}{%
\pgfdeclareimage[#1]{#2}{./art/#3}%
}{%
% check if we can found it in TEXINPUTS
\IfFileExists{#3}{%
\pgfdeclareimage[#1]{#2}{#3}%
}{%
\GenericError{}{Theme image #3 not found!}{Consult Sam for all the details, but pressing 'H' might give you the right hint.}{The file '#3' has to be available either in a local 'art' directory or somehwere in your TEXMF tree.}
}%
}%
}%
\samdeclareimage[width=.5\paperwidth]{test}{myexample.pdf}
\begin{document}
\begin{frame}
\pgfuseimage{test}
\end{frame}
\end{document}