
Quero iterar todas as imagens em um determinado diretório e importar cada imagem de \includegraphics
dentro do arquivo MainInput.tex
. O arquivo em lote IterateFiles.bat
nos ajuda a criar uma lista de nomes de imagens no diretório especificado.
rem IterateFiles.bat
echo off
rem %1 represents the path (relative to the main input file) to the files to be iterated
rem %2 represents the output file name
rem the remaining args represent the extensio of file to be iterated
set curdir=%CD%
cd %1
shift
set output=%curdir%\%1.list
copy nul %output%
shift
:loop
if "%1"=="" goto :eof
dir /b *.%1 >> %output%
shift
goto :loop
A implementação atual da \IterateFiles
macro leva 3 argumentos. Os primeiros 2 argumentos são o caminho (relativo ao MainInput.tex
) para o diretório no qual as imagens são salvas. O ruim aqui é que precisamos especificar o mesmo caminho em 2 formas: ..\dirsep Images\dirsep
e ../Images/
.
% MainInput.tex
\documentclass{article}
\usepackage{graphicx}
{
\catcode`\^0
\catcode`\\12
^gdef^dirsep{\}
}
\newread\myfile
\newcount\TotalFiles
\makeatletter
\newcommand{\IterateFiles}[3]{%
\immediate\write18{IterateFiles #1 \jobname\space #3}
\openin\myfile=\jobname.list\relax
\loop
\read\myfile to \mydata
\unless\ifeof\myfile
\filename@parse{\mydata}
\section*{\mydata}
\includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{#2\filename@base}
\advance\TotalFiles1\relax
\repeat
\closein\myfile
}
\makeatother
\begin{document}
\IterateFiles{..\dirsep Images\dirsep}{../Images/}{jpg png pdf eps}
\section*{Summary}
There are \the\TotalFiles\ files in total.
\end{document}
Minha pergunta: como passar um único argumento de caminho de arquivo ../Images/
(em oposição a dois argumentos) para a macro acima?
Responder1
Use o xstring
pacote para substituir /
s por \
s (ou vice-versa):
\StrSubstitute{../Images}{/}{\dirsep}}
Responder2
Oh meu fantasma, aparentemente o shell de comando do Windows também pode analisar arquivos ../Images/
. Eu não sabia disso.
% MainInput.tex
\documentclass{article}
\usepackage{graphicx}
\newread\myfile
\newcount\TotalFiles
\makeatletter
\newcommand{\IterateFiles}[2]{%
\immediate\write18{IterateFiles #1 \jobname\space #2}
\openin\myfile=\jobname.list\relax
\loop
\read\myfile to \mydata
\unless\ifeof\myfile
\filename@parse{\mydata}
\section*{\mydata}
\includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{#1\filename@base}
\advance\TotalFiles1\relax
\repeat
\closein\myfile
}
\makeatother
\begin{document}
\IterateFiles{../Images/}{jpg png pdf eps}
\section*{Summary}
There are \the\TotalFiles\ files in total.
\end{document}
Aviso: há um bug oculto aqui ao usar \filenamb@base
em vez de \mydata
. Se houver nomes de arquivos iguais com extensões diferentes, apenas um deles será incluído. Para solução mais detalhada, consulteComo cortar o caractere de fim de linha para cada linha lida de um arquivo externo?.