Mientras intentaba mejorar uno de mis paquetes, me preguntaba si es posible iterar a través de la lista de archivos de un directorio en expl3 (leí que l3interfaces.pdf
expl3 tiene algunas funciones de E/S, pero parece que no pueden escanear directorios).
El caso de uso es el siguiente: tengo un documento principal. Esto incluirá algunos archivos especiales generados con una aplicación externa y almacenados en directorios fuera de la ruta.
Entonces la pregunta es: ¿Cómo se expl3
vería un "escáner de directorios" (solo quiero especificar el directorio) o tengo que usar Lua para este propósito?
Respuesta1
expl3
está escrito en tex, por lo que se limita a las instalaciones que proporciona tex, por lo que no puede hacer esto a menos que use -shell-escape
luatex.
Por ejemplo, esto escribirá una lista de archivos tex en el directorio actual si eso es lo que ls *.tex
se genera en su sistema operativo. (probablemente dir *.tex
en 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}
Si lo ejecuto obtengo 105 páginas que parecen
Respuesta2
Con TeX Live 2017 se enviará una versión mejorada de TeXOSQuery, que también se ejecuta en el shell restringido:
\documentclass{article}
\usepackage{texosquery}
\TeXOSQuery{\result}{-i ; .}
\show\result
\stop
Esto produce
> \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.
Luego puede utilizar métodos estándar para dividir la \result
macro en componentes.
Existen restricciones sobre a qué directorios puede acceder, por razones de seguridad, pero los directorios secundarios del directorio de trabajo deben ser seguros.