我可以根据文件系统自动加载章节和部分吗?

我可以根据文件系统自动加载章节和部分吗?

我想知道我是否可以根据文件系统加载我的书的章节和部分。例如:

Chapter 1/
  Section 1.tex
  Section 2.tex
  Section 3.tex
Chapter 2/
  Section 1.tex
  Section 2.tex
Chapter 3/
  Section 1.tex
  Section 2.tex
  Section 3.tex

我正在使用 scrbook。

答案1

如果您有定义良好的命名结构,则不需要外部脚本,这些脚本很可能是特定于操作系统的。从编程角度来看,此解决方案有一些开销,但应该可以满足您的需求。可能需要进行一些调整,因为我不确定您想从哪里开始新的章节。如果每个目录中的文件 Section1 都以 开头\chapter,那么就可以开始了。

\documentclass{article}

\newcommand*{\MaxNumOfChapters}{10}% Adjust these two settings for your needs.
\newcommand*{\MaxNumOfSections}{6}%

\usepackage{pgffor}%

\begin{document}
\foreach \c in {1,2,...,\MaxNumOfChapters}{%
    \foreach \s in {1,2,...,\MaxNumOfSections}{%
        \IfFileExists{Chapter\c/Section\s} {%
            \input{Chapter\c/Section\s}%
        }{%
                % files does not exist, so nothing to do
        }%
    }%
}%
\end{document}

另请注意,我假设目录和文件名中没有空格。如果您需要空格,您可以调整它,但我发现这是我尽量避免的额外工作。

这里可能还有一些多余的空格%,但我遇到了额外空格的问题,添加它们应该没有坏处。

答案2

\documentclass[a4paper]{report}
\usepackage{etoolbox}
\makeatletter
\begingroup
\everyeof{\noexpand}
\edef\next{\@@input|"ls -dm Chapter*" }
\begingroup\edef\x{
  \endgroup\xdef\noexpand\auto@chapters{\noexpand\zap@space\next\space\noexpand\@empty}}\x
\def\do#1{%
  \csxdef{auto@#1}{\@@input|"ls -m #1/Section*.tex" }}
\expandafter\docsvlist\expandafter{\auto@chapters}
\endgroup

\def\makedocument{\renewcommand{\do}[1]{%
    \begingroup\edef\x{%
      \endgroup\noexpand\forcsvlist\noexpand\input{\csuse{auto@##1}}}\x}%
   \expandafter\docsvlist\expandafter{\auto@chapters}}
\makeatother

\begin{document}
\makedocument
\end{document}

您有责任将命令放入文件“section1.tex”中\chapter。但也可以修改宏来处理这个问题。

当然,这只是一个练习:使用 shell 脚本会更好。我没有尝试在名称中使用空格,因为这是坏事与 TeX 大致相同。

您需要使用--shell-escape命令行选项启动 (pdf)LaTeX 才能使其工作。

答案3

非 PSTricks 特有的 multido 包也可以类似地执行此操作。换句话说,您可以使用 forpdflatexlatex-dvips-ps2pdf

\IfFileExists{filepath}{true-jobs}{false-jobs}可用于检查给定的文件路径是否存在。如果存在,则执行第二个括号中的代码,否则执行第三个括号中的代码。

情况 1:路径中没有空格

\documentclass{article}

\usepackage{multido}

\begin{document}
    \multido{\ic=1+1}{10}%
    {%
            \multido{\is=1+1}{6}%
            {%  
                    \IfFileExists{Chapter\ic/Section\is}%
                    {%
                        \input{Chapter\ic/Section\is}%
                    }%
                    {%
                        % do nothing :-) 
                    }%
            }%
    }%
\end{document}

情况 2:路径中有空格

我在 Windows 上测试过,成功了。别忘了用一对“”符号括起路径。

\documentclass{article}

\usepackage{multido}

\begin{document}
    \multido{\ic=1+1}{10}%
    {%
            \multido{\is=1+1}{6}%
            {%  
                    \IfFileExists{"Chapter \ic/Section \is"}%
                    {%
                        \input{"Chapter \ic/Section \is"}%
                    }%
                    {%
                        % do nothing :-) 
                    }%
            }%
    }%
\end{document}

对于那些了解 C# 编程的人来说,此链接可能对你有帮助大致了解如何迭代文件结构并填充输入文件。

相关内容