我想\input
按字母顺序显示某个目录中以“前缀”开头的所有 tex 文件。类似这样的命令\input{prefix*tex}
很好,但不起作用。
有没有什么解决方法?
答案1
我会使用你的操作系统,例如
ls prefix*tex | sed -e 's/\(.*\)/\\input{\1}/' > list-prefix.tex
pdflatex main
将为每个匹配的文件创建一个文件,每行list-prefix.tex
一个。\input{..}
prefix*.tex
main.tex
如果有的话,将会输入所有文件\input{list-prefix}
。
如果你只需要输入(并且从不添加标题等,并且想避免创建临时文件,则可以使用
\input{"|cat prefix*.tex"}
但随后你必须处理你的main.tex
或pdflatex --shell-escape
同等的。
我在这里使用了 unix shell 命令,但是如果您替换适当的命令,在 windows 上也可以同样工作(或者在 windows 上使用 bash,这是我个人所做的)
答案2
当然,您必须使用 shell 转义,因为 TeX 没有通配符功能。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\xinput}{m}{%
\azimut_xinput:n { #1 }
}
\ior_new:N \g_azimut_xinput_stream
\cs_new_protected:Nn \azimut_xinput:n
{
\ior_open:Nn \g_azimut_xinput_stream { "|ls ~ #1" }
\ior_map_inline:Nn \g_azimut_xinput_stream { \file_input:n { \tl_trim_spaces:n {##1} } }
}
\ExplSyntaxOff
\begin{document}
\xinput{az-*.tex}
\end{document}
Unix 系统上的命令ls
返回文件列表中每行一个元素,因此我们可以将这些行映射到\file_input:n
。
你必须用
pdflatex -shell-escape
在 Windows 系统上,使用的命令可能与不同ls
。
我用三个文件进行了测试,az-a.tex
和az-b.tex
。az-c.tex
这是显示文件已输入的终端输出。
(./azimut.aux) (./az-a.tex) (./az-b.tex) (./az-c.tex) [1{/usr/local/texlive/201
4/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./azimut.aux) )</usr/local/te
xlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on azimut.pdf (1 page, 10198 bytes).
这可以轻松扩展以执行更多操作;例如,您可能想要输入文件名:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\xinput}{m}{%
\azimut_xinput:n { #1 }
}
\ior_new:N \g_azimut_xinput_stream
\cs_new_protected:Nn \azimut_xinput:n
{
\ior_open:Nn \g_azimut_xinput_stream { "|ls ~ #1" }
\ior_map_inline:Nn \g_azimut_xinput_stream
{
\par\noindent\texttt{##1}\par\nopagebreak
\file_input:n { \tl_trim_spaces:n {##1} }
}
}
\ExplSyntaxOff
\begin{document}
\xinput{az-*.tex}
\end{document}
为了举例说明,这些文件只包含一个字母。