嵌套包含循环行为异常

嵌套包含循环行为异常

我正在尝试为正在撰写的论文实现基于文件系统的文件包含,并且之前曾就此主题提出过问题。接受的答案在我只有一个发现循环的情况下,这似乎有效。但是,如果我尝试嵌套它们,它的行为就会很奇怪。


因此,复制原始问题中的一些细节:

我的文件系统如下所示:

article.tex
sections/
|-- 00-introductions.tex
|-- 10-data.tex
|-- 20-analysis.tex
|-- 90-conclusions.tex
|-- data/
|   |-- 00-xxx.tex 
|   |-- NN-xxx.tex
|
|-- analysis/
    |-- 00-xxx.tex
    |-- NN-xxx.tex

article.tex现在的样子是:

\documentclass[twocolumn, a4paper]{article}

\input{packages.tex}

\addbibresource{bibliography.bib}

\title{xxx}

\author{xxx}
\date{\today}

\newread\sections
\openin\sections=build/sections.list

\newread\data
\openin\data=build/data.list

\begin{document}
\twocolumn[
  \begin{@twocolumnfalse}
    \maketitle
    \begin{abstract}
     {\lipsum[1-2]}
     \bigskip
    \end{abstract}
  \end{@twocolumnfalse}
]


\loop
{\endlinechar=-1 \global\read\sections to \next}
\ifx\next\empty\else
\input{sections/\next}
\repeat

\printbibliography

\end{document}

/sections因此,就目前情况而言,这很好地包含了所有文件。

不过,我也想把所有内容都/sections/data纳入10-data.tex因此我将其添加到文件中:

\section{Data}

\loop
{\endlinechar=-1 \global\read\data to \next}
\ifx\next\empty\else
\input{sections/data/\next}
\repeat

然而,这会导致引言和数据部分被发现,并且所有子部分都被发现,/data/sections但随后它停止了。出于某种原因,外循环似乎没有添加20-analysis.tex90-conclusions.tex添加到article.tex。外循环似乎停止了。

这是怎么回事?LaTex 不支持嵌套循环吗?有办法解决这个问题吗?

答案1

好像\input{}本身并没有创建新的范围。

为了修复这个问题,你可以用括号将它括起来,如下所示:

\loop
{\endlinechar=-1 \global\read\sections to \next}
\ifx\next\empty\else
{\input{sections/\next}}
\repeat

附注:如果您打算重新使用此功能,可以将其包装在新命令中:

% Include every file in a directory based on an externally generated list of file-names.
% #0 - Iterator name
% #1 - List of files to include
% #2 - Directory the files are in
\newcommand{\IncludeFromDirectory}[3]{%
\newread#1
\openin#1=#2

\loop
{\endlinechar=-1 \global\read#1 to \next}
\ifx\next\empty\else
{\input{#3/\next}}
\repeat
}

然后像这样使用:

\IncludeFromDirectory{\sections}{build/sections.list}{sections}

答案2

正在做\input在团体内

这是我构建的结构:

├── article.aux
├── article.log
├── article.pdf
├── article.tex
├── data.list
├── sections
│   ├── 00-introductions.tex
│   ├── 10-data.tex
│   ├── 20-analysis.tex
│   ├── 90-conclusions.tex
│   ├── analysis
│   └── data
│       ├── 00-xxx.tex
│       └── NN-xxx.tex
└── sections.list

该文件sections.list

00-introductions.tex
10-data.tex
20-analysis.tex
90-conclusions.tex

并且data.list

00-xxx.tex 
NN-xxx.tex

这些文件.texI'm \textt{<filename>}包含10-data.tex

I'm \texttt{10-data.tex}

\inputfromlist[sections/data]{data.list}

当然article.tex

\documentclass[twocolumn, a4paper]{article}

\ExplSyntaxOn

\NewDocumentCommand{\inputfromlist}{O{.}m}
 {% #1 = prefix (default current directory)
  % #2 = file list
  \scottishtapwater_lists:nn { #1 } { #2 }
 }

\ior_new:N \g_scottishtapwater_lists_files_ior
\int_new:N \g_scottishtapwater_lists_level_int

% syntactic sugar
\cs_new:Nn \__scottishtapwater_lists_level:
 {
  g_scottishtapwater_lists_files_ \int_eval:n { \g_scottishtapwater_lists_level_int } _seq
 }

\cs_new_protected:Nn \scottishtapwater_lists:nn
 {
  \int_gincr:N \g_scottishtapwater_lists_level_int
  \seq_gclear_new:c { \__scottishtapwater_lists_level: }
  \ior_open:Nn \g_scottishtapwater_lists_files_ior { #2 }
  \ior_str_map_inline:Nn \g_scottishtapwater_lists_files_ior
   {
    \seq_gput_right:cn { \__scottishtapwater_lists_level: } { ##1 }
   }
  \ior_close:N \g_scottishtapwater_lists_files_ior
  \seq_map_inline:cn { \__scottishtapwater_lists_level: }
   {
    \tl_if_empty:nF { ##1 } { \input{#1/##1} \par }
   }
  \int_gdecr:N \g_scottishtapwater_lists_level_int
 }

\ExplSyntaxOff

\begin{document}

\inputfromlist[sections]{sections.list}

\end{document}

在此处输入图片描述

这个想法是逐行读取列表,并根据整数变量提供的级别填充它们\g_scottishtapwater_lists_level_int。因此,我们可以嵌套尽可能多的\inputfromlist命令,而不会引入不必要的分组。

相关内容