是否有一种真正复杂的方法可以将名称符合特定条件的所有文件(例如所有.cpp、.h 文件)包含在给定的目录路径中?
\documentclass{article}
\begin{document}
\lstAllFromDirectory{directory}{*.cpp *.h}
\end{document}
我应该使用什么方法才能获得这样的结果?
答案1
使用平台独立方法texosquery
(需要 Java):
\documentclass{article}
\usepackage{texosquery}
\begin{document}
\TeXOSQueryFilterFileList{\result}{,}{.*\string\.(cpp|h)}{.}
\makeatletter
\ifx\result\empty
Query Failed!
\else
\@for\thisfile:=\result\do{%
File: \texttt{\thisfile}.\par
}
\fi
\makeatother
\end{document}
它需要 shell 转义。如果调用该文件,test.tex
则:
pdflatex -shell-escape test
使用 MikTeX,您还需要启用管道 shell 转义(--enable-pipes
)。
有三种变体texosquery
:
texosquery-jre5
:至少需要 Java 5,但没有完整的功能并且安全性较低;texosquery
(默认):至少需要 Java 7,具有几乎全套功能,但某些文件操作有限制;texosquery-jre8
:至少需要 Java 8,具有全套功能,但某些文件操作有限制,现在已列入 TeX Live 的可信应用程序列表中。
因此,如果您拥有 Java 8 并且texosquery-jre8
在限制列表中(针对 TL2017),那么您可以使用受限 shell 转义。
要从默认切换texosquery
到texosquery-jre8
,您需要编辑文件texosquery.cfg
。最简单的方法是将安装的复制texosquery.cfg
到本地或主 TEXMF 树并从那里进行编辑。这样,在更新发行版时它就不会被覆盖。
设置\TeXOSInvokerName
为所需的应用程序:
\def\TeXOSInvokerName{texosquery-jre8}
取消注释以下行以允许应用程序在受限模式下运行:
\TeXOSQueryAllowRestricted
(仅当应用程序确实在限制列表中时才执行此操作。)现在您可以执行此操作(使用 TeX Live):
pdflatex test
或者使用 MikTeX:
pdflatex --enable-pipes test
也适用于纯 eTeX:
\input texosquery
\TeXOSQueryFilterFileList{\result}{,}{.*\string\.(cpp|h)}{.}
\ifx\result\empty
Query Failed!
\else
% iterate over comma-separated list stored in \result using your preferred method
\fi
\bye