自动删除不需要的包

自动删除不需要的包

和其他人一样,我通常使用模板来编写我的论文,其中包含我排版文档通常需要的所有内容(包、宏等)。但是,我的需求有时会发生变化,最后我发现自己加入了一些我并不需要的包。

我通常在序言中做的是\usepackage{P} % R,其中 R 是包含包 P 的原因(例如命令集)。这样我就可以检查 R 是否适用于我的文档,如果不适用,则删除 P,但这仍然是一个相当繁琐的过程。有谁知道一个脚本可以检查文档中不需要的包或命令吗?

答案1

如果您有 Linux(或其他可以在 grep 上运行 bash 和 gnu 版本的系统),请编写如下脚本:

#!/bin/sh

> notneeded
> needed

fgrep '\usepackage' $1 | cut -f 2 -d '{' | cut -f 1 -d '}' |
while read a; do
    egrep -v "\\usepackage(\[.+\])?\{$a\}" $1 > tmp.tex
    latex -halt-on-error tmp.tex &&
        echo $a >> notneeded || echo $a >> needed
done

如果您将其另存为unused.sh,则运行它unused.sh mydoc.tex,您将获得名为的文件notneeded

如果在同一行中有两个,则此操作会中断\usepackage。可以使用-ogrep 进行更正。但是,更复杂的情况通常最好使用 perl 来完成。

E:还有更多需要考虑的。首先,可能存在未使用的 tikzlibaries。您可能有需要但不需要的\usetikzlibrary{shapes,arrows}地方。arrowsshapes

然后,有些包虽然被使用但并不是“需要的”,因为“没有它就无法编译”,例如microtype。OK,当你删除一个包时,你可以检查文档是否有任何变化,但是,hypersetup 会将 ModDate 放入 PDF 元数据中。

答案2

不可能,除非你写了一个脚本来收集全部命令和环境,并将其与您的文档进行比较。

答案3

打补丁\newcommand来记录哪些包定义了什么,以及使用了什么,在这里可能有用,但我不确定这是否值得付出努力。只是不要包含太多。或者,忍受多几毫秒的不必要的编译时间。

相关内容