在较大的乳胶项目中,我使用 \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