У меня есть папка, содержащая 95 файлов 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
Mishal Ahmed 11 Ноя 2019 в 18:13
Может помочь tex.stackexchange.com/a/7657
 – 
user360448
11 Ноя 2019 в 18:39

4 ответа

В простом сценарии оболочки с использованием 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
4
Jeff Schaller 11 Ноя 2019 в 18:22
Мне любопытно, почему вы не применили перенаправление вывода прямо в скрипте?
 – 
AdminBee
11 Ноя 2019 в 18:24
Вы, конечно, могли бы, если бы у вас всегда было одно и то же имя файла; Я оставил его открытым, чтобы больше соответствовать типичному фильтру UNIX.
 – 
Jeff Schaller
11 Ноя 2019 в 18:25
Верный момент, хотя вы все равно можете вызвать скрипт с параметром для имени файла;)
 – 
AdminBee
11 Ноя 2019 в 18:27
 – 
Jeff Schaller
11 Ноя 2019 в 18:29
Спасибо, Джефф. Вот тупой вопрос. Мне не удается выполнить сценарий оболочки (я всегда запускаю его прямо из командной строки, но на этот раз мне нужно запустить его из сценария). Я скопировал ваш код в Combine.sh (как с #!/bin/sh, так и без него), а затем запустил sh Combine.sh > all.tex. Я получаю: не найдено 1: comb.sh \begin{document}.
 – 
Mishal Ahmed
11 Ноя 2019 в 18:38

Вероятно, не самое лучшее, но вот решение, использующее sed для редактирования файла all.tex:

sed -e 's/^/\\input\{/g' -e 's/$/\}/g' all.tex
0
Panki 11 Ноя 2019 в 18:22

В обычной Ubuntu по умолчанию установлен Perl, поэтому вы можете сделать это следующим образом:

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

Возможно, он еще не установлен в Ubuntu в Windows, в этом случае apt-get install perl-base поможет.

EDIT: Если perl недоступен и вы не хотите его устанавливать, вы также можете использовать sed:

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

(Но я всегда рекомендую более мощный perl)

0
Garo 11 Ноя 2019 в 18:30

Используя GNU awk:

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

Это создаст список, такой как тот, который вы показываете, с файлами, перечисленными в том порядке, в котором оболочка расширяет шаблон подстановки имен файлов *.tex.

Для файлов с именами от file1.tex до file95.tex это будет не в порядке номеров. Для этого вы можете переключиться на оболочку zsh и использовать вместо этого шаблон подстановки file<1-95>.tex или более расслабленный шаблон *.tex(n).

0
Kusalananda 12 Апр 2020 в 14:20