我有一个名为的文件夹diary
,其中包含一系列文件:
20120101.tex
20120105.tex
20120304.tex
- ETC。
如何创建一个按字母顺序包含每个文件的单个 LaTeX 文档?我想在 LaTeX 中执行此操作,而不是使用 LuaTeX 或 shell 操作(以使其可移植)。
我发现这里有接近解决方案,但在这种情况下我无法让它正常工作。
\documentclass{book}
\usepackage{xifthen}
\begin{document}
% 20120101.tex included here
% 20120105.tex included here
% etc
\end{document}
上面链接的用于迭代我尝试修改的文件的近解决方案的代码是:
\foreach \Year in {\StartYear,...,\EndYear}
{ \foreach \Month in {Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}
{ \foreach \Day in {1,...,31}
{ \IfFileExists{\Year/\Month/\Day}
{ \newread\mysource
\openin\mysource=\Year/\Month/\Day.tex
\read\mysource to \firstline
\closein\mysource
\xdef\writetitle{1}
\begin{loggentry}{\Year - \Month - \Day}{\firstline}
\xdef\writetitle{0}
\input{\Year/\Month/\Day}
\end{loggentry}
}
{ % files does not exist, so nothing to do
}
}
}
}
这是我失败的修改,我不想查看年份/月份子目录,而是读取上面列出的文件:
\foreach \Year in {\StartYear,...,\EndYear}
{ \foreach \Month in {01,02,03,04,05,06,07,08,09,10,11,12}
{ \foreach \Day in {01,...,31}
{ \IfFileExists{{Year}{Month}{Day}}
{ \newread\mysource
\openin\mysource={Year}{Month}{Day}.tex
\read\mysource to \firstline
\closein\mysource
\xdef\writetitle{1}
\begin{loggentry}{\Year - \Month - \Day}{\firstline}
\xdef\writetitle{0}
\input{{YearMonth/\Day}
\end{loggentry}
}
{ % files does not exist, so nothing to do
}
}
}
}
问题在于连接变量来创建文件名而不是子目录,我不知道该怎么做(显然,上面的方法不起作用)。
答案1
这是我之前的回答的改编如何迭代文件夹中文件的名称:
笔记:
- 假设所有文件都命名为
YYYYMMDD.tex
。 - 所有 的 文件 都 已经 准备 好 了
\input
. - 您可以调整值以
\MinYear
\MaxYear
适应。 - 这里有一些开销,每天都会进行检查。所以除非你要写多年的日记,否则这应该不是问题。
- 如果你想单独排版每个日记条目,你应该看看这
standalone
。如果您的日记记录很少,这可能没有多大价值,但如果它们很长,这将很有用,因为您可以随时查看每一天并确保所有内容排版正确,然后只需以一定时间间隔运行主程序即可。 尝试失败的原因之一是代码
\foreach \Day in {01,...,31}
产生了以下序列:01 2 3 ... 9 10 11 ... 30 31
因此,虽然第一天是正确的,但后续第 2-9 天不是两位数。
参考:
代码:
\documentclass{article}
\usepackage{pgffor}%
%\usepackage{filecontents}
\begin{filecontents*}{20120201.tex}
Feb 1, 2012:
First day of Feb. Got cold today.
\end{filecontents*}
\begin{filecontents*}{20120202.tex}
Feb 2, 2012:
Second day of Feb. Got even colder today.
\end{filecontents*}
\newcommand*{\MinYear}{2012}% Adjust these two settings for your needs.
\newcommand*{\MaxYear}{2013}
% https://tex.stackexchange.com/questions/56207/how-to-convert-a-one-digit-number-to-a-two-digit-number
\newcommand\TwoDigits[1]{%
\ifnum#1<10 0#1\else #1\fi
}
\begin{document}
\foreach \YYYY in {\MinYear,...,\MaxYear}{%
\foreach \MM in {1,2,...,12}{%
\foreach \DD in {1,2,...,31}{%
\edef\FileName{\YYYY\TwoDigits{\MM}\TwoDigits{\DD}}
\IfFileExists{\FileName} {%
\par
\input{\FileName}%
}{%
% files does not exist, so nothing to do
}%
}%
}%
}%
\end{document}