![我可以根据文件系统自动加载章节和部分吗?](https://linux22.com/image/237979/%E6%88%91%E5%8F%AF%E4%BB%A5%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD%E7%AB%A0%E8%8A%82%E5%92%8C%E9%83%A8%E5%88%86%E5%90%97%EF%BC%9F.png)
我想知道我是否可以根据文件系统加载我的书的章节和部分。例如:
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 包也可以类似地执行此操作。换句话说,您可以使用 forpdflatex
和latex-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# 编程的人来说,此链接可能对你有帮助大致了解如何迭代文件结构并填充输入文件。