Как получить список имен файлов рисунков, встроенных в документ

Как получить список имен файлов рисунков, встроенных в документ

У меня есть документ TeX, в который встроено огромное количество рисунков из figпапки, которая заполнена еще большим количеством других рисунков.

Я хотел бы переместить документ вместе с его рисунками, но я не хочу перемещать всю figпапку, а только те рисунки, которые встроены в документ.

Есть ли пакет (или какой-либо другой способ), который позволяет мне, например, распечатать имена файлов всех рисунков, встроенных в документ? Что-то вроде:

fig/figurename1.eps
fig/figurename2.eps
...
etc

Затем я мог бы просто скопировать и вставить этот список, добавить несколько cpсимволов в простой текстовый файл и автоматизировать копирование этих файлов в нужное мне место, запустив файл в своей оболочке:

$ cp fig/figurename1.eps wherever/fig/
$ cp fig/figurename2.eps wherever/fig/
...
etc

Конечно, это всего лишь идея, если у кого-то есть альтернатива «перечислению файлов и копированию-вставке в файл оболочки», я был бы рад выслушать =)

решение1

Вы можете изменить \includegraphcsмакрос, чтобы добавить в список и распечатать список в конце документа. MWE ниже дает следующий вывод:

Figures included were
 images/figA.jpg
 images/figB.png

Примечания:

  • В этом случае \letтакже будет работать (согласно комментарию egreg наИзменить размер всех изображений в Latex до ширины в процентах), но я привык использовать \LetLtxMacrofromпакетletltxmacroдля макросов, которые имеют необязательные параметры. Подробное описание \LetLtxMacroможно найти в этом вопросе озакрытый символ квадратного корня.

  • Эта [demo]опция используется для того, чтобы поместить черный ящик туда, где будет находиться фигурка в демонстрационных целях. При реальном использовании (когда у вас действительно будут доступны фигурки) эту опцию необходимо удалить.

  • Если бы вы хотели, вы могли бы использовать \immediate\write18и выполнить cpкоманду оболочки внутри \foreachцикла и иметь каталог в конце набора, который содержит изображения, которые были включены. Никакой дальнейшей обработки не потребовалось бы.

Код:

\documentclass{article}
\usepackage[demo]{graphicx}% Remove [demo] option in real usage.
\usepackage{letltxmacro}
\usepackage{pgffor}


%% https://tex.stackexchange.com/questions/14393/how-keep-a-running-list-of-strings-and-then-process-them-one-at-a-time
\newcommand\FigList{}
\newcommand\AddFigToList[1]{\edef\FigList{\FigList#1,}}

\LetLtxMacro{\OldIncludegraphics}{\includegraphics}
\renewcommand{\includegraphics}[2][]{%
    \AddFigToList{#2}%
    \OldIncludegraphics[#1]{#2}%
}

\newcommand*{\ShowListOfFigures}{%
    \typeout{Figures included were}%
    \foreach \x in \FigList {%
        %\par\x% <-- uncomment if you want the list in the PDF as well
        \typeout{ \x}
    }%
}
\AtEndDocument{\ShowListOfFigures}

\begin{document}
\includegraphics{images/figA.jpg}

\includegraphics{images/figB.png}
\end{document}

решение2

pdflatexпредоставляет флаг -recorder, который записывает .flsфайл. Все, что INPUTтам отмечено, это файлы, которые он открыл во время обработки. latexmkиспользует флаг -depsили -deps-out=FILENAMEдля отображения приличий и в последнем случае также сохраняет их в makeотформатированном FILENAME.

решение3

В Linux подойдет что-то вроде этого, без изменения исходного кода:

strace -fe open  make 2>&1  1>/dev/null | grep plots | sed 's/.*\"\(.*\)\".*/\1/' > plots.list

Где :

  • make— это команда, которую вы используете для формирования выходных данных (может быть какой-то вариацией pdflatex file.tex).

  • straceотображает системные вызовы. С параметрами, которые мы предоставляем, мы сохраняем только "открытые" системные вызовы ( -eопция), чтобы получить вставленные цифры (а также другие открытые файлы foe сейчас). Параметры -fотображают системные вызовы подпроцессов, а перенаправления сохраняют только вывод strace.

  • grep plotsвыбирает строки, содержащие общую строку в пути (в данном случае «участки»).

  • sedвыбирает то, что находится внутри кавычек.

  • Окончательное перенаправление сохраняет результат в файле.

Таким образом вы можете получить дублирующиеся имена файлов, но этого может быть достаточно, в зависимости от ваших потребностей.

решение4

perlНа CTAN есть скрипт,texdependкоторый делает все это и даже больше. Он обрабатывает все виды внутренних и внешних зависимостей и может генерировать информацию в формате Makefile, perlили 1 на строку.

>texdepend
Find LaTex dependencies, Version: 0.96, Michael Friendly ([email protected])
Usage: C:\batchfiles\texdepend.pl <options> texfile[.tex]
  where <options> may be abbreviated to unique truncations, and are:
   -help               print this measly help
   -expand             expand package/include file to full path names
   -format = make      print dependencies in Makefile format
             perl      print in the form of perl assignments (LatexMk)
             1         print one per line (with # separators)
   -ignore = list      list of file types to be ignored in .log [default: fd]
   -out = filename     send output to filename
   -print =            Any one or more of i (includes) p (packages)
                       f (figs) b (bibfiles) s (styles) d (all dependencies)
   -styles = list      list of file types for  from .log [default: sty]
   -verbose

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