
Я пытаюсь изменить команду, \includegraphics{}
чтобы записать имя включенного файла, включая его путь и расширение, в текстовый файл. Что у меня есть на данный момент:
\makeatletter
\newwrite\myfile
\immediate\openout\myfile=myfigures.txt
\let\TempCmd\Ginclude@graphics
\renewcommand{\Ginclude@graphics}[1]{\TempCmd{#1}\immediate\write\myfile{#1}}
\makeatother
Единственная проблема в том, что расширение файла не будет записано, если оно не указано. Например, если у меня есть mypic.eps
в подпапке с именем figures
, и я пишу \includegraphics{figures/mypic}
, то myfigures.txt
будет figures/mypic
записано только в нее, когда то, что я хочу, должно figures/mypic.eps
быть записано.
Я пытался покопаться в graphicx.sty и snapshot.sty, чтобы посмотреть, смогу ли я разобраться, как они обрабатывают расширения имен файлов, и сам что-нибудь схакать, но пока не смог разобраться. Если я вставлю \filename@parse{#1}
туда, то ничего не получу за \filename@ext
.
Вот мой минимальный рабочий пример (просто предоставьте любое изображение по вашему выбору):
\documentclass{article}
\usepackage{graphicx}
\makeatletter
\newwrite\myfile
\immediate\openout\myfile=myfigures.txt
\let\TempCmd\Ginclude@graphics
\renewcommand{\Ginclude@graphics}[1]{\TempCmd{#1}\immediate\write\myfile{#1}}
\makeatother
\begin{document}
\includegraphics{mypic}
\end{document}
решение1
graphics
уже пробует различные расширения и в зависимости от выбранного бэкенда определяет, какой файл вы используете, поэтому вам нужно подключиться непосредственно перед вызовом бэкенда для фактического включения файла, а не в команде верхнего уровня.
\documentclass{article}
\usepackage{graphicx}
\makeatletter
\newwrite\myfile
\immediate\openout\myfile=myfigures.txt
\let\TempCmd\Gin@setfile
\def\Gin@setfile#1#2#3{\TempCmd{#1}{#2}{#3}\immediate\write\myfile{#3}}
\makeatother
\begin{document}
\includegraphics{mypic}
\end{document}
Производит
mypic.png