Ao tentar aprimorar um dos meus pacotes, me perguntei se é possível iterar pela lista de arquivos de um diretório no expl3 (li que l3interfaces.pdf
o expl3 tem alguns recursos de IO, mas eles parecem incapazes de verificar diretórios).
O caso de uso é o seguinte: tenho um documento principal. Isto incluirá alguns arquivos especiais gerados com um aplicativo externo e armazenados em diretórios fora do caminho.
Então a questão é: como seria um expl3
"scanner de diretório" (quero apenas especificar o diretório) ou preciso usar Lua para essa finalidade?
Responder1
expl3
é escrito em tex, portanto é limitado às facilidades que o tex fornece, portanto você não pode fazer isso a menos que use -shell-escape
ou luatex.
Por exemplo, isso irá compor uma lista de arquivos tex no diretório atual, se for isso que ls *.tex
gera em seu sistema operacional. (provavelmente dir *.tex
no Windows)
\documentclass{article}
\newread\zzz
\begin{document}
\def\zzpar{\par}
\openin\zzz="|ls *tex"
\loop
\read\zzz to \tmp
\ifx\tmp\zzpar\else
\par[\expandafter\detokenize\expandafter{\tmp}]%
\fi
\ifeof\zzz\else
\repeat
\end{document}
Se eu executá-lo, recebo 105 páginas parecidas com
Responder2
Com o TeX Live 2017 será lançada uma versão aprimorada do TeXOSQuery, que também roda no shell restrito:
\documentclass{article}
\usepackage{texosquery}
\TeXOSQuery{\result}{-i ; .}
\show\result
\stop
Isso produz
> \result=macro:
->dl.log;dl.tex;install-tl;LICENSE.CTAN;LICENSE.TL;osq.log;osq.tex;qrp.log;qrp.
pdf;qrp.tex;query.aux;query.log;query.pdf;query.tex;rand.log;rand.pdf;rand.tex;
release-texlive.txt;texmf-dist;texnician.log;texnician.tex;texosquery.cfg;texpu
t.log;tlpkg;tt.aux;tt.idx;tt.ilg;tt.ind;tt.log;tt.pdf;tt.tex.
Você pode então usar métodos padrão para dividir a \result
macro em componentes.
Existem restrições sobre quais diretórios você pode acessar, por motivos de segurança, mas os diretórios filhos do diretório de trabalho devem ser seguros.