Я пишу свою диссертацию / диссертацию, и, поскольку это постоянная работа, у меня не всегда есть фактические изображения, готовые для рисунков, которые я положил в свой документ, но по разным причинам хочу, чтобы он автоматически заменял фиктивную. фигура на месте, когда включенный графический файл не существует. Например. Я могу сделать что-то вроде \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%
}%
Кроме того, вот гораздо более простая версия, которая, похоже, имеет аналогичные проблемы:
\newcommand{\figFileOrDummy}[1]{%
\def\dummyfig{commands/dummy}%
\dummyfig%
}
Команды \def
, похоже, обрабатываются после расширения макроса, который они пытаются определить, поэтому в итоге получается \def {commands/dummy}...
(обратите внимание на пробел после \def
) и, очевидно, жалуется.
Также кажется, что буквальное содержимое макроса рассматривается как имя файла для \includegraphics
, а не для его разрешения / расширения, поэтому жалуется, что файл '\def {commands/dummy}... .png'
не существует ..
Я пытался сделать что-то вроде
\edef\figfilename{\figFileOrDummy{\chapdir/figures/fluxcapacitor}}
, чтобы заставить его \figfilename
содержать только значение , а не полный макрос, но я получаю ошибку Undefined control sequence
с жалобами на переменные, которые я пытаюсь \def
в \figFileOrDummy
макрос не определен.
Так что мой вопрос либо
- Как мне правильно развернуть этот макрос ?; или
- Если это неправильный способ структурирования моих макросов, как мне на самом деле структурировать такой макрос, чтобы иметь возможность автоматически вставлять фиктивные / реальные цифры ?; или
- Есть ли пакет, который уже хорошо обрабатывает такие вещи, которые я пропустил?
Я чувствую, что мне здесь не хватает чего-то довольно фундаментального ...