我可以让LaTeX宏'返回'文件名吗?

drf*_*lat 9 macros latex return-value tex

我正在撰写我的论文/论文,因为它正在进行的工作中我并不总是为我放入文档中的数字准备好实际的图像,但出于各种原因希望自动将它替换为虚拟图形到位当包含的图形文件不存在时.例如,我可以做类似的事情\includegraphics[width=8cm]{\chapdir/figures/fluxcapacitor}(\chapdir我的'当前'章节目录的宏是哪里,例如\def\chapdir{./ch_timetravel},如果没有,./ch_timetravel/figures/fluxcapacitor.jpg它将插入./commands/dummy.jpg代替.

我已经构建了我的宏(也许是天真的?),所以我有一个宏(\figFileOrDummy)通过检查提供给它的参数是否存在来确定要包含的相应文件,以便我可以调用\includegraphics[properties]{\figFileOrDummy{\chapdir/figures/fluxcapacitor}}.除了我遇到各种各样的错误,这取决于我如何调用它,这似乎表明我正在以一种根本上有缺陷的方式解决问题,就像"好的LaTeX编程"一样.

这是用于检查文件是否存在的宏(并且'返回'文件名或虚拟文件名):


\newcommand{\figFileOrDummy}[1]{%
    % Figure base name (no extension) to be used if the file exists
    \def\fodname{#1}%
    \def\dummyfig{commands/dummy}%
    % Check if output is PS (.EPS) or PDF (.JPG/.PDF/.PNG/...) figures
    \ifx\pdfoutput\undefined%
        % EPS figures only
        \IfFileExists{\fodname.eps}{}{\def\fodname{\dummyfig}}%
    \else%
        % Check existence of various extensions: PDF, TIF, TIFF, JPG, JPEG, PNG, MPS
        \def\figtest{0}% flag below compared to this value
        \IfFileExists{\fodname.pdf}{\def\figfilenamefound{1}}{\def\figfilenamefound{0}}%
        \IfFileExists{\fodname.jpg}{\def\figfilenamefound{1}}{}%
        \IfFileExists{\fodname.png}{\def\figfilenamefound{1}}{}%
        % and so on...
        % If no files found matching the filename (flag is 0) then use the dummy figure
        \ifx\figfilenamefound\figtest%
            \def\fodname{\dummyfig}%
        \fi%
    \fi%
    % 'return' the filename
    \fodname%
}%
Run Code Online (Sandbox Code Playgroud)

或者,这是一个更简单的版本,似乎有类似的问题:

\newcommand{\figFileOrDummy}[1]{%
    \def\dummyfig{commands/dummy}%
    \dummyfig%
}
Run Code Online (Sandbox Code Playgroud)

这些\def命令似乎是他们试图定义的宏扩展之后处理的,所以它最终成为\def {commands/dummy}...(注意后面的空格\def)并且显然是抱怨.

它似乎也将宏的文字内容视为文件名\includegraphics,而不是先解析/扩展它,所以抱怨文件'\def {commands/dummy}... .png'不存在.

我也尝试过做类似的事情 \edef\figfilename{\figFileOrDummy{\chapdir/figures/fluxcapacitor}},试图强制它只\figfilename保留而不是完整的宏,但是我得到一个Undefined control sequence错误,抱怨我\def\figFileOrDummy宏中尝试的变量是未定义的.

所以我的问题是

  1. 如何正确展开此宏?要么
  2. 如果这是构造我的宏的错误方法,我应该如何实际构造这样的宏,以便能够自动插入虚拟/真实数字?要么
  3. 是否有一个包已经很好地处理了这种类型的东西,我忽略了?

我觉得我错过了一些非常基本的东西......

Cha*_*art 3

我认为重点是 \expandafter 只对其参数作为表示文件名的字符串感兴趣,因此不会评估它 - 宏语言是懒惰的!尝试\expandafter {\includegraphics[width=8cm]}{\chapdir/figures/fluxcapacitor}

风格两点:

  1. 如果行以控制序列结尾,则无需在行尾放置 % 来阻止虚假空格:控制序列会吞噬所有后续空格,包括行尾。根据我的口味,这使得代码更具可读性。请特别注意,对于 Tex 的“嘴”来说,\def\newcs{abc}\def \newcs {abc}是相同的:它们是完全相同的标记序列。
  2. 我把代码放在 \figtest 周围:如果你使用 \newif 原语(使用 \newif\figexists 创建新测试,使用 \figexiststrue、\figexistsfalse 设置/重置,并测试),你会得到更好的错误报告 - 总是以 Tex 为代价 -与 \iffigexists...) 或 Latex ifthenelse 包(以保持正统)。

清理后的代码

我首先认为问题出在其他地方,所以写了一些更漂亮的东西:

\def\dummypath{命令/虚拟}%
\ifx\pdfoutput\未定义
\def\figFileOrDummy#1{\IfFileExists
    {#1.eps}{#1}\虚拟路径}
\别的
\def\figFileOrDummy#1{\IfFileExists
    {#1.pdf}{#1}{\IfFileExists
      {#1.jpg}{#1}{\IfFileExists
        {#1.png}{#1}\dummypath}}} %或者有更多图形类型,如果您愿意的话。
\fi