我正在写一个包含很多章节的长文档。它们都使用 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文件为空字符串,然后正常编译。