通过分别(预)编译章节来加快编译速度?

通过分别(预)编译章节来加快编译速度?

我正在写一个包含很多章节的长文档。它们都使用 etc 从根文档中包括进来\input{chapterX.tex}。编译所有内容需要很长时间。

为了加快编译速度,我通常会注释掉大多数\input命令,只包含我目前正在处理的章节。但这是一个糟糕的方法,因为这样对当前未包含的章节的引用将不起作用,目录几乎是空的。

我想知道是否有方法可以进行预编译?理想情况下,它会检测到,当我正在处理时chapter1.tex,etc. 中没有任何chapter2.tex变化,并重用以前编译运行的结果。

这可能吗?这就像语言中的单独编译单元一样C

答案1

您无法预编译章节,但您可以使用该\includeonly机制来确保您的交叉引用和页码保持正确,同时选择仅包含部分源。

答案2

稍微扩展一下约瑟夫的回答:这意味着你使用\include不是 \input以包含所需章节。请参阅这里例如用法。

答案3

上述答案对我帮助很大,我使用了该\includeonly方法一段时间,但不得不用\includeonly正确的文件手动编辑行,这太麻烦了。然后我意识到这项工作可以很容易地实现自动化,我编写了一个小脚本来帮我完成这项工作,并在这里与大家分享:

我的想法是只包含自上次创建 pdf 以来修改过的文件(实际上这就是我想要的)。为此,我在序言中输入了一个文件仅限.tex。此文件将包含带有 的行,\includeonly并将由我的脚本自动生成。

因此,我的主要 tex 文件如下所示:

主文本

\documentclass{article}
\input{only.tex}
\begin{document}
\include{fileA.tex}
\include{fileB.tex}
\end{document}

为了生成仅限.tex文件中,我的脚本检索 pdf 的最后修改日期,并写入仅限.tex所有比该日期更新的 .tex 文件的名称(使用查找 - 较新的命令)

差异文件

TARGET=only.tex
LAST=$(stat --format='%Y' build/$1.pdf) # last modification of the pdf file
elapsed=$(echo "$(date +%s) - $LAST" | bc) # number of seconds elapsed since
echo "last modification was $elapsed seconds ago"

printf "\includeonly{" > $TARGET
for i in $(find . -name "*.tex" -newermt "$elapsed seconds ago"); do
    file="$(basename $i)"
    # we skip the generated file, and the main .tex file which is an
    # argument of this script
    if [ "$file" != "$1.tex" ] && [ "$file" != $TARGET ]; then
        printf "$file," >> $TARGET
    fi
done
printf "}" >> $TARGET

这个脚本很可能可以改进,变得更强大或更简洁,但我个人从未觉得有必要这样做。

最后,剩下要做的就是将整个内容包装在一个 Makefile 中,这样我就可以在部分 (制作) 和完整编译 (使充分)。

Makefile

partial:
    ./diff.sh main
    pdflatex main.tex

full :
    echo "" > only.tex
    pdflatex main.tex

当部分编译时,我们首先调用差异文件脚本,然后正常编译,而完整的编译只需覆盖仅限.tex文件为空字符串,然后正常编译。

相关内容