Пытаясь улучшить один из своих пакетов, я задался вопросом, возможно ли выполнить итерацию по списку файлов каталога в expl3 (я читал, l3interfaces.pdf
что в expl3 есть некоторые возможности ввода-вывода, но они, похоже, не могут сканировать каталоги).
Вариант использования следующий: у меня есть один основной документ. Он должен включать некоторые специальные файлы, сгенерированные внешним приложением и сохраненные в каталогах за пределами пути.
Итак, вопрос: как будет expl3
выглядеть «сканер каталогов» (я хочу только указать каталог) или мне придется использовать Lua для этой цели?
решение1
expl3
написан на tex, поэтому ограничен возможностями, предоставляемыми tex, поэтому вы не сможете этого сделать, если не используете -shell-escape
или luatex.
Например, это позволит набрать список tex-файлов в текущем каталоге, если это то, что ls *.tex
генерируется в вашей операционной системе. (вероятно, dir *.tex
в 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}
Если я запущу его, то получу 105 страниц, которые будут выглядеть так:
решение2
Вместе с TeX Live 2017 будет поставляться улучшенная версия TeXOSQuery, которая также работает в ограниченной оболочке:
\documentclass{article}
\usepackage{texosquery}
\TeXOSQuery{\result}{-i ; .}
\show\result
\stop
Это выводит
> \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.
Затем можно использовать стандартные методы разбиения \result
макроса на компоненты.
По соображениям безопасности существуют ограничения на то, к каким каталогам вы можете получить доступ, но дочерние каталоги рабочего каталога должны быть безопасными.