如何在 Latex 文档中添加批量 \section 和 \input

如何在 Latex 文档中添加批量 \section 和 \input

我正在为我的食谱编写一本烹饪书。我使用 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.txt

Teige_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

相关内容