![如何在 Latex 文档中添加批量 \section 和 \input](https://linux22.com/image/372968/%E5%A6%82%E4%BD%95%E5%9C%A8%20Latex%20%E6%96%87%E6%A1%A3%E4%B8%AD%E6%B7%BB%E5%8A%A0%E6%89%B9%E9%87%8F%20%5Csection%20%E5%92%8C%20%5Cinput.png)
我正在为我的食谱编写一本烹饪书。我使用 cuisine 包,我的所有食谱都在单独的目录中的单独文件中。将文件包含在 latex 中不是问题。但我喜欢自动化。因为文件是“正在进行的工作”,并且经常添加或更改。我在这里找到了一个 bash 脚本:https://tex.stackexchange.com/questions/298792/sort-sections-according-to-alphabetical-order/299600#299600
。但这不包括目录。这是我的文件结构中的一个示例:
tellan@tellan1:~/Dokumente/kochen/buch/buch$ ls -1g *
Suppen_Eintoepfe:
insgesamt 12K
-rwxr-xr-x 1 tellan 539 2017 年
7 月 21 日 Chilieconcarne.txt -rwxr-xr-x 1 tellan 1,3K 2017 年 7 月 21 日 Waterzooi.txt
-rw-r--r-- 1 tellan 912 11 月 8 日 12:45 Wild_Consomme_Mit_Bratapfelkloesschen.txtTeige_Und_Massen:
insgesamt 28K
-rw-r--r-- 1 tellan 848 2017 年 7 月 22 日 Biskuitteig.txt
-rw-r--r-- 1 tellan 633 2017 年 7 月 22 日 Brandteig.txt
-rw-r--r-- 1 tellan 226 10 月 5 日 15:29 Grundfarce.txt
这是我的基本乳胶文件:
\documentclass[a4paper,12pt,oneside,parskip,openany]{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{geometry}
\usepackage{a4wide}
\usepackage{hyperref}
\usepackage[nonumber,contents,index]{cuisine}
\usepackage{nicefrac}
\usepackage{xpatch}
\usepackage[automark]{scrpage2}
\usepackage{ulem}
\usepackage{graphicx}
\usepackage{pdfpages}
\makeatletter
\xpatchcmd{\Displ@ySt@p}{\arabic{st@pnumber}}{}{}{}
\makeatother
\usepackage{makeidx}
\newcommand\tab[1][1cm]{\hspace*{#1}}
\renewcommand*{\recipetitlefont}{\sffamily}
\begin{document}
\title{Kochbuch}
\author{Ich}
\maketitle
\tableofcontents
\chapter{Nicht dein Kochbuch}
\newpage
\section{Vorspeisen Und Salate}
\input {Vorspeisen_Und_Salate/7-Layer-Dip.txt}
\input {Kuchen/Banana_Fudge_Brownies.txt}
\input {Kuchen/Bananen-Haferflocken-Muffins.txt}
\section{Soßen}
\input {Sossen/Asiatische_Bbq-Sosse.txt}
\input {Sossen/Barbecue-Sosse_Aus_Fertigprodukten.txt}
\input {Sossen/Currysosse_Nr_1.txt}
\section{Ect}
\input {Ect/Mengenangaben.txt}
\input {Ect/backformen.txt}
\input {Ect/umrechnungstabelle_us.txt}
\end{document}
按照 Hands 的说法,它工作得很好。我知道这不是最简洁的命令结构,但它确实有效。到目前为止,我可以通过 bash 输入文件,但不包括目录/部分输入。
#!/bin/bash
echo "" > sectionlist.tex
for sfile in `ls -1 */*.txt | cut -f 1 -d . | sort -d`
do
echo "\input {$sfile.txt}" >> sectionlist.tex
done
感谢 Masroor 提供的脚本。我也在使用 sed 语法。但到现在为止还没有成功。我的编程技能不是很好。
答案1
我猜这实际上不是一个 (La)TeX 问题,但是这个脚本能完成您所要求的任务吗?
第一部分只是创建您提到的目录/文件(如果它们尚不存在,否则它什么也不做)。第二部分创建一个 tex 文件,其中包含\section{<dirname with spaces instead of underscores>}
每个目录以及\input{<filename>}
这些目录中的每个文本文件。
#!/bin/bash
########################################
## Remove this for the final version: ##
########################################
mkdir -p "Suppen_Eintoepfe" "Teige_und_Massen"
touch "Suppen_Eintoepfe/Chilieconcarne.txt" "Suppen_Eintoepfe/Waterzooi.txt" "Suppen_Eintoepfe/Wild_Consomme_Mit_Bratapfelkloesschen.txt"
touch "Teige_und_Massen/Biskuitteig.txt" "Teige_und_Massen/Brandteig.txt" "Grundfarce.txt"
########################################
echo "%% This file was automatically generated by $(basename "$0")" > sectionlist.tex
find . -mindepth 1 -maxdepth 1 -type d | cut -c 3- | sort -df | while read -r sdir; do
txtfilefound=false #*
find "$sdir" -maxdepth 1 -type f -iname '*.txt' | cut -f 1 -d . | sort -df | while read -r sfile; do
if [ "$txtfilefound" = false ]; then #*
echo $'\n'"\\section{${sdir//_/ }}" >> sectionlist.tex #*
txtfilefound=true #*
fi #*
echo "\\input{$sfile.txt}" >> sectionlist.tex
done
done
运行此命令后,内容sectionlist.tex
将是:
%% This file was automatically generated by makesectionlist.sh
\section{Suppen Eintoepfe}
\input{Suppen_Eintoepfe/Chilieconcarne.txt}
\input{Suppen_Eintoepfe/Waterzooi.txt}
\input{Suppen_Eintoepfe/Wild_Consomme_Mit_Bratapfelkloesschen.txt}
\section{Teige und Massen}
\input{Teige_und_Massen/Biskuitteig.txt}
\input{Teige_und_Massen/Brandteig.txt}
但是,如果您的章节标题带有特殊字符(这似乎是可能的,因为食谱名称是德语),那么这种方法可能不太有效。如果这是个问题,您可以考虑0title.txt
在每个目录中创建一个名为 的文件,其中只包含\section{<Section title>}
,并<Section title>
用 替换为该章节的标题。此文件将排在以字母开头的文件之前。如果您这样做,您应该删除上面标记的所有行#*
。
注意:sort -d
区分大小写,这意味着它会将所有大写字母排在所有小写字母之前。由于这可能不是您想要的,因此我改用了sort -df
。