查找未被其他任何文件包含的文件

查找未被其他任何文件包含的文件

在较大的乳胶项目中,我使用 \include 来包含章节文件,并使用 \input 来包含节和小节。

我刚刚发现由于重新排列,一些 \input 命令丢失了,因此几个文件没有被包含在内,并且不再是生成的 PDF 的一部分。

我不确定是否还有其他包含项丢失。我该如何有效地检查?

我的.tex 文件分散在一个文件夹及其一个子文件夹中,大约有 30 或 40 个 .tex 文件。

我正在使用 ubuntu(如果有 latex 之外的解决方案)

答案1

在 Linux 下,您可以使用 的功能bash。首先,创建一个数组——一个列表.tex当前文件夹中文件的列表(基于一个奇妙的StackOverflow 答案):

arr=( $(find ./ -maxdepth 1 -iname "*.tex" | cut -c3- | sort | rev | cut -c5- | rev ) )

lerycut删除了./每个文件开头的(但我们仍想保留相对文件路径,因此我们不能对它们进行printf或操作)。如果您想要递归搜索,请删除该选项。显然有些人包含没有扩展名的文件,因此代码进行了修改:我们截断了扩展名,然后随意搜索它。-exec basename-maxdepth 1.tex更新。除此之外,我们还需要带有扩展名的原始文件列表,因此我们需要运行此命令(基于此解决方案):

arrtex=( $(find ./ -maxdepth 1 -iname "*.tex" | cut -c3- | sort ) )
arrtex=$(printf " %s" "${arrtex[@]}")
arrtex=${arrtex:1}

假设您想搜索它们是否包含在您的主文件中,只需循环遍历列表的每个元素并检查它是否存在于主文件中:

for i in "${arr[@]}"
do
 a="\\\\in(put|clude)\{${i}(\.tex)\}"
 if grep -P -q -e "${a}" ${arrtex}
 then msg="found"
 else msg="NOT found"
 fi
 echo "Inclusion of ${i} in any TeX file: ${msg}"
done

显然,您应该忽略主文件未包含在主文件中的事实。我只是希望此代码就这么简单。

如果您只想在主文件中搜索内含物(例如main.tex),请使用此简化版本:

arr=( $(find ./ -maxdepth 1 -iname "*.tex" | cut -c3- | sort | rev | cut -c5- | rev ) )
for i in "${arr[@]}"
do
 a="\\\\in(put|clude)\{${i}(\.tex)\}"
 if grep -P -q -e "${a}" main.tex
 then msg="found"
 else msg="NOT found"
 fi
 echo "Inclusion of ${i} in main.tex: ${msg}"
done

还有很大的改进空间,因此欢迎提出任何建议!

我最近的项目的示例输出(其中chap02.tex是实际章节、main.tex是主文件、TODO.tex是笔记的垃圾堆):

Inclusion of chap02 in any TeX file: found
Inclusion of main in any TeX file: NOT found
Inclusion of TODO in any TeX file: NOT found

echo ${arr[@]}
chap02 main TODO

相关内容