使用 expl3 逐行读取并处理文件内容

使用 expl3 逐行读取并处理文件内容

在组织为以下的多文件项目中:

mainfile.tex
subfile1/subfile1.tex
subfile2/subfile2.tex
...

为了使每个子文件都可以单独编译,并且使得子文件之间可以引用,我目前正在使用该包xr,并在子文件的序言中写入以下内容:

\externaldocument{../subfile1/subfile1}
\externaldocument{../subfile2/subfile2}
...

但为了避免输入当前文件,我必须删除\externaldocument{../subfile1/subfile1}subfile1.tex删除\externaldocument{../subfile2/subfile2}subfile2.tex。当文件数量增加时,这使得子文件的前言难以维护。

我想知道这是否可以自动化,即在中存储一个子文件列表list.tex,每个子文件的名称位于单独的行上:

subfile1
subfile2
...

并在子文件中逐行读取此文件,比较当前行是否为空或等于\jobname,如果不是,则添加行\externaldocument{../current-line/current-line}

可以使用 expl3 来做到这一点吗?


以下是一组要测试的文件。这些文件的组织方式如下:

list.txt
main.tex
subfile-one/subfile-one.tex
subfile-two/subfile-two.tex

以下是文件内容。

  • list.txt (最后一行空是故意的)
subfile-one
subfile-two

  • 主文本
\documentclass{article}
\usepackage{docmute}
\begin{document}
\input{subfile-one/subfile-one.tex}
\input{subfile-two/subfile-two.tex}
\end{document}
  • 子文件-one.tex
\documentclass{article}

\usepackage{xr}

% \externaldocument{../subfile-two/subfile-two}

\setcounter{section}{0}
\begin{document}

\section{one}
\label{one}

\ref{two}

\end{document}
  • 子文件-two.tex
\documentclass{article}

\usepackage{xr}

% \externaldocument{../subfile-one/subfile-one}

\setcounter{section}{1}
\begin{document}

\section{two}
\label{two}

\ref{one}

\end{document}

预期行为:

在此处输入图片描述

每个子文件应该包含其中的一半。

答案1

应该执行以下操作(由于问题中缺少可编译代码,因此未经测试):

\documentclass{article}

\ExplSyntaxOn
\tl_clear_new:N \l_jinwen_files_tl
\prg_generate_conditional_variant:Nnn \str_if_eq:nn { on } { F }
\ior_new:N \g_jinwen_file_ior
\ior_open:Nn \g_jinwen_file_ior { list.tex }
\ior_map_inline:Nn \g_jinwen_file_ior
  {
    \str_if_eq:onF { \jobname } {#1}
      {
        \tl_put_right:Nn \l_jinwen_files_tl
          { \externaldocument { ../#1/#1 } }
      }
  }
\ior_close:N \g_jinwen_file_ior
\exp_last_unbraced:NV \ExplSyntaxOff \l_jinwen_files_tl

\begin{document}
whatever
\end{document}

相关内容