子文件包 - 两层(子文件中包含子文件)

子文件包 - 两层(子文件中包含子文件)

虽然subfiles 包的文档声明支持嵌套,但我不知何故无法使其工作。我有以下结构:

./main.tex
./level1/level1.tex
./level1/level2/level2.tex

这些文件具有以下内容(MWE):

%%% ./main.tex
\documentclass{article}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{subfiles}
\begin{document}
Level 0
\subfile{level1/level1}
\end{document}



%%% ./level1/level1.tex
\documentclass[../main.tex]{subfiles}
\begin{document}
Level 1
\subfile{level2/level2}
\end{document}



%%% ./level1/level2/level2.tex
\documentclass[../../main.tex]{subfiles}
\begin{document}
Level 2
\end{document}

为了方便起见,我上传了结构这里(有效期至 2018 年 1 月 23 日)。

我希望所有文件都在各自的位置进行编译。目前,level2.tex 和 level1.tex 可以编译,但当我尝试编译 main.tex 时,它给出了错误

! LaTeX Error: File `level2/level2.tex' not found

我可以通过改变以下行来编译 main.tex

\subfile{level2/level2}

在 level1.tex 中

\subfile{level1/level2/level2}

但是 level1.tex 无法编译,因为(显然)它再也找不到 level2.tex。

必须有一种自动化的方法,以便所有文件都能编译并且输入路径能够自动更新,对吗?

提前感谢您的帮助!

答案1

答案 1

不要自己担心路径,而是通过修改输入路径让 tex 为您找到文件。

% !TeX root = main.tex
\documentclass{article}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{subfiles}

\makeatletter
\providecommand*{\input@path}{}
\g@addto@macro\input@path{{./level1//}{./level1/level2//}{./level2//}}
\makeatother

\begin{document}
Level 0
\subfile{level1}
\end{document}

% !TeX root = level1.tex
\documentclass[../main.tex]{subfiles}
\begin{document}
Level 1
\subfile{level2}
\end{document}

% !TeX root = level2.tex
\documentclass[../../main.tex]{subfiles}
\begin{document}
Level 2
\end{document}

答案 2

如果不同子文件夹中的多个文件共享相同的名称,则第一个答案将失败。在这种情况下,您可以测试文件是否存在于给定位置,并据此选择正确的路径。

% !TeX root = level1.tex
\documentclass[../main.tex]{subfiles}

\begin{document}
Level 1

\IfFileExists{./level2/level2.tex}{
    \subfile{./level2/level2}
}{
    \subfile{./level1/level2/level2}
}

\end{document}

相关内容