我正在关注本教程(部分子文件)关于如何使用包子文件来处理大型 latex 文档。我使用这个包是因为我希望能够单独编译每个章节。我将章节保存在 ./tex/ 中,但 main.tex 位于根目录中。
当我编译 main.tex 时,没有出现错误,但当我尝试编译章节时,却出现错误,因为找不到文件 ./mystyle.sty。如果我转到 main.tex 并将行 \usepackage{./mystyle} 更改为 \usepackage{../mystyle},我现在可以编译章节,但无法编译 main.tex。我可以通过提供 mystyle.sty 的完整路径来解决这个问题,但它无法在其他计算机上使用。我宁愿不使用独立包,因为我想使用命令 \chapter。
我读过了关于同一问题的六年前的帖子但我想知道是否同时修改了子文件包以解决这个问题,或者是否有办法在独立包中使用 \chapter。
答案1
在我看来,解决这个问题的干净方法是正确安装mystyle.sty
在你的 texmf 文件夹中。
如果您不想这样做,您可以将父文件夹添加到输入路径,请参阅是否可以为 \input{...} 全局设置类似于 \graphicspath{...} 的默认路径?如何做到这一点,然后使用\usepackage{mystyle}
。
答案2
如果您的子文件位于根文件夹内的文件夹中,如下所示:
root/
|- main.tex
|- mystyle.sty
|- tex/
|- chapter1.tex
|- chapter2.tex
您可以使用 \providecommand 定义一个 \main 变量,该变量提供到根目录的相对路径:
% main.tex
\providecommand{\main}{.}
\documentclass[...]
...
\usepackage{subfiles}
\usepackage{\main/mystyle}
...
\subfile{tex/chapter1}
\subfile{tex/chapter2}
% chapter1.tex
\providecommand{\main}{..}
\documentclass[\main/main.tex]{subfiles}
...
% chapter2.tex
\providecommand{\main}{..}
\documentclass[\main/main.tex]{subfiles}
...
由于\providecommand
定义一次命令,然后忽略下一次重新定义,当您仅编译时chapter1.tex
,\main
取值“..”,并且当子文件包含的前导码时main.tex
,\main
实际上被“..”替换。
编辑:显然,你不应该给出路径\usepackage
。你可以看到它,因为你收到了一个警告:
LaTeX 警告:您请求包‘../mystyle’,但该包提供的是‘mystyle’。
如果您不关心警告,您可以离开,因为它有效(神奇的是......)
如果你不想看到警告,那么在 tex/ 中创建 mystyle.sty 的符号链接是一个可行的解决方案。请参阅这个答案
编辑2:如果您想要分别编译章节的原因是为了性能,而不是您真的想要只有一个章节的 PDF,那么\include
和命令似乎\includeonly
是 的绝佳替代品。subfiles
要使用它,只需将所有 替换\subfile{}
为\include
。然后,在 main.tex 的序言中,您可以使用 :
\includeonly{chapter2}
,这将创建一个包含封面和封底等所有内容的文档,但缺少 chapter1 和您未指定的所有其他内容。它甚至使用生成的 .aux 文件来保持与整个文档一致的页码。
答案3
subfiles
此问题已在版本及以后的软件包中得到解决v1.4 2019/10/25
;另请参阅其文档,无需定义\main
。只需这样使用:
% main file
\documentclass{myclass}
\usepackage{mystyle}
\usepackage{subfiles} % should be loaded last in the preamble!
\begin{document}
...
\end{document}
% subfile in sub-directory
\documentclass[../main]{subfiles}
\begin{document}
...
\end{document}
顺便说一下,该subfiles
包应该在序言中最后加载。