迭代目录中的文件并包含它们

迭代目录中的文件并包含它们

我有一个名为的文件夹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}

相关内容