Can I make a LaTeX macro 'return' a filename?
Posted
by drfrogsplat
on Stack Overflow
See other posts from Stack Overflow
or by drfrogsplat
Published on 2010-05-18T09:55:24Z
Indexed on
2010/05/18
10:01 UTC
Read the original article
Hit count: 229
I'm writing my thesis/dissertation and since its an on-going work I don't always have the actual images ready for the figures I put into my document, but for various reasons want to automatically have it substitute a dummy figure in place when the included graphics file doesn't exist. E.g. I can do something like \includegraphics[width=8cm]{\chapdir/figures/fluxcapacitor}
(where \chapdir
is a macro for my 'current' chapter directory, e.g. \def\chapdir{./ch_timetravel}
and if there's no ./ch_timetravel/figures/fluxcapacitor.jpg
it'll insert ./commands/dummy.jpg
instead.
I've structured my macros (perhaps naïvely?) so that I have a macro (\figFileOrDummy
) that determines the appropriate file to include by checking if the argument provided to it exists, so that I can call \includegraphics[properties]{\figFileOrDummy{\chapdir/figures/fluxcapacitor}}
. Except I'm getting various errors depending on how I try to call this, which seem to suggest that I'm approaching the problem in a fundamentally flawed way as far as 'good LaTeX programming' goes.
Here's the macro to check if the file exists (and 'return' either filename or the dummy filename):
\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%
}%
Alternatively, here's a much simpler version which seems to have similar problems:
\newcommand{\figFileOrDummy}[1]{%
\def\dummyfig{commands/dummy}%
\dummyfig%
}
The \def
commands seems to be processed after the expansion of the macro they're trying to define, so it ends up being \def {commands/dummy}...
(note the space after \def
) and obviously complains.
Also it seems to treat the literal contents of the macro as the filename for \includegraphics
, rather than resolving/expanding it first, so complains that the file '\def {commands/dummy}... .png'
doesn't exist..
I've tried also doing something like
\edef\figfilename{\figFileOrDummy{\chapdir/figures/fluxcapacitor}}
to try to force it to make \figfilename
hold just the value rather than the full macro, but I get an Undefined control sequence
error complaining the variables I'm trying to \def
in the \figFileOrDummy
macro are undefined.
So my question is either
- How do I make this macro expand properly?; or
- If this is the wrong way of structuring my macros, how should I actually structure such a macro, in order to be able to insert dummy/real figures automatically?; or
- Is there a package that already handles this type of thing nicely that I've overlooked?
I feel like I'm missing something pretty fundamental here...
© Stack Overflow or respective owner