Написание имен файлов, используемых с graphicsx

Написание имен файлов, используемых с graphicsx

Я пытаюсь изменить команду, \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

Связанный контент