パッケージの 1 つを拡張しようとしているときに、expl3 でディレクトリのファイル リストを反復処理できるかどうか疑問に思いました ( l3interfaces.pdf
expl3 にはいくつかの IO 機能があると読みましたが、ディレクトリをスキャンすることはできないようです)。
使用例は次のとおりです。メイン ドキュメントが 1 つあります。これには、外部アプリケーションで生成され、パス外のディレクトリに保存されるいくつかの特殊ファイルが含まれます。
そこで質問です。expl3
「ディレクトリ スキャナー」(ディレクトリのみを指定したい) はどのようになるのでしょうか。それとも、この目的のために Lua を使用する必要がありますか。
答え1
expl3
は tex で記述されているため、tex が提供する機能に制限されており、 -shell-escape
または luatex を使用しない限り、これを実行することはできません。
たとえば、ls *.tex
オペレーティング システムで生成される場合、現在のディレクトリにある 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
マクロをコンポーネントに分割できます。
セキュリティ上の理由から、アクセスできるディレクトリには制限がありますが、作業ディレクトリの子ディレクトリは安全であるはずです。