\input 文件名中包含通配符(正则表达式)

\input 文件名中包含通配符(正则表达式)

我想\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.texpdflatex --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.texaz-b.texaz-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}

在此处输入图片描述

为了举例说明,这些文件只包含一个字母。

相关内容