在组织为以下的多文件项目中:
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}