虽然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}