生成包含目录中所有文件名的tex文件

生成包含目录中所有文件名的tex文件

我有一个包含 95 个 tex 文件的文件夹。我需要创建一个包含以下代码的 tex 文件 all.tex:

\documentclass[10pt]{article}
\begin{document}
\input{file1.tex}
\input{file2.tex}
...
\input{file95.tex}
\end{document}

文件名是这样的不是有任何模式,因此我不能使用循环。以上只是一个工作示例。

我在 bash 上尝试了以下操作:

printf '%s\n' *.tex | paste -sd "\n" - > all.tex

这将创建一个如下所示的 all.tex 文件:

file1.tex
file2.tex
...
file95.tex

如何在文件名周围添加 \input{}?如何添加序言等?

我在用bash(在 Ubuntu 上)在 Windows 10 上。

答案1

在一个简单的 shell 脚本中,使用printf简单的通配符扩展:

#!/bin/sh

printf '%s\n' '\documentclass[10pt]{article}' \
              '\begin{document}'

printf '\input{%s}\n' *.tex

printf '%s\n' '\end{document}'

您可以调用该脚本并重定向输出,例如:

/path/to/script > /path/of/output.tex

在单个命令行上,您可以将打印分组在一起以进行单个重定向:

{ printf '%s\n' '\documentclass[10pt]{article}' \
              '\begin{document}'
printf '\input{%s}\n' *.tex
printf '%s\n' '\end{document}'
} > /path/of/output.tex

答案2

可能不是最好的,但这是一个用于sed编辑all.tex文件的解决方案:

sed -e 's/^/\\input\{/g' -e 's/$/\}/g' all.tex

答案3

常规的 Ubuntu 默认安装了 perl,所以你可以这样做:

ls *tex | perl -pne 's/(.*)/\\input{$1}/' > allfiles.tex

可能是它还没有安装在 Windows 上的 Ubuntu 上,如果是这种情况apt-get install perl-base就可以了。

编辑:如果 perl 不可用并且您不想安装它,您也可以使用 sed:

ls *tex | sed 's/\(.*tex\)/\\input{\1}/' > allfiles.tex

(但我总是推荐更强大的perl)

答案4

使用 GNU awk

awk '
    BEGIN     { print "\\documentclass[10pt]{article}"
                print "\\begin{document}" }
    BEGINFILE { printf("\\include{%s}\n", FILENAME); nextfile }
    END       { print "\\end{document}" }' *.tex

这将生成一个列表,如您所显示的列表,其中文件按照 shell 扩展文件名通配模式的顺序列出*.tex

file1.tex对于通过 to命名的文件file95.tex,这将不是按数字顺序。为此,您可能需要切换到 shellzsh并使用file<1-95>.texglobbing 模式或更宽松的模式*.tex(n)

相关内容