Como passar um único argumento de caminho de arquivo para uma macro?

Como passar um único argumento de caminho de arquivo para uma macro?

Quero iterar todas as imagens em um determinado diretório e importar cada imagem de \includegraphicsdentro do arquivo MainInput.tex. O arquivo em lote IterateFiles.batnos 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 \IterateFilesmacro 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\dirsepe ../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 xstringpacote 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@baseem 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?.

informação relacionada