有没有办法让 TeX 删除文件?
在我的文档中创建了很多辅助文件,如果在使用完其内容后就将其删除就好了。
答案1
如果您想删除文档目录中的这些文件,请使用可选参数-output-directory=whatever
。然后所有辅助文件和 pdf 都会保存在该目录中。例如我使用的:
pdflatex -output-directory=target <file>
那么我的<file>.pdf
也在 中target
,但我总是使用软链接ln -s target/<file>.pdf
,那么我的文档目录中也有它。但正如马丁已经指出的那样,只有当您真正确定您的 pdf 文件已完成时,删除辅助文件才有意义。
如果你想复制创建的 pdf,那么使用
\usepackage{shellesc}
\AtEndDocument{\ShellEscape{cp /<target>/\jobname.pdf /home/voss/}}
替换/home/voss/
为 pdf 应复制到的目录。然后使用
pdflatex --shell-escape -output-directory=<target> <file>
不过,编写一个小脚本似乎更容易。
答案2
不,TeX 本身不能删除文件,只能创建或覆盖它们。您需要使用外部工具(如 LaTeX 编辑器或 Makefile)来为您删除它。例如,latexmk
有一个-c
选项可以清除所有辅助文件。
我也使用 Linux 下的 Makefile,其中包含clean
删除所有辅助文件的规则。然而,这在 Windows 下并不是一个好方法。至少如果你不习惯它的话。你可以在线程中找到辅助文件扩展名的列表版本控制软件应该忽略哪些辅助 LaTeX 文件?)。
但是,您应该注意,经常删除辅助文件会对编译时间产生负面影响。然后您将被迫编译文档 2-3 次,有时甚至更多次。一些 (La)TeX 编译器(例如 MikTeX)还提供将辅助文件放在不同文件夹中的功能。这样它们就不会在您的主文件夹中打扰您。
答案3
另一个解决方案是使用--clean
来自的标志rubber
。
rubber
根据项目描述,它是“一个用于处理与 LaTeX 文档编译相关的所有任务的程序。这当然包括编译文档本身,编译次数足够多,以便定义所有引用,并运行 BibTeX 来管理书目引用。还包括自动执行 dvips 以生成 PostScript 文档,以及使用 pdfLaTeX 生成 PDF 文档。”
假设我有一个mydoc.tex
创建以下辅助文件的文件:
mydoc.aux mydoc.ilg mydoc.log
mydoc.idx mydoc.ind mydoc.toc
当然,除了mydoc.pdf
。运行以下命令时
rubber --clean mydoc
仅剩两个文件:
mydoc.pdf mydoc.tex
如果我仅想要mydoc.tex
,则使用rubber --pdf --clean mydoc
就可以了。
根据手册:
--clean
:删除编译生成的所有文件,而不是构建文档。此选项仅在 rubber 中存在。它适用于编译,就像使用命令行的其他选项一样,即说rubber --clean foo
不会删除foo.ps
,而说rubber --ps --clean foo
会。
如果你需要一些“高级”清理过程,还有一个clean
指令。指令是这样的一行
% rubber: cmd args
该行必须以 开头%
,然后是任意符号和空格序列%
,然后是文本,rubber:
后跟零个或多个空格和指令名称,可能后跟空格和参数。
假设dummy.txt
每次编译时都会生成一个文件mydoc.tex
。我想删除它,因此我在中添加了以下指令mydoc.tex
:
% rubber: clean dummy.txt
\documentclass{article}
...
现在,运行 时rubber --clean mydoc
,dummy.txt
将被删除。根据手册:
clean <file>
表示使用 清理时应删除指定的文件--clean
。
好了,有一个干净的项目文件夹。:)
答案4
有@paulo 的精彩arara
(酷炫的 TeX 自动化工具),我无法想象没有它我还能工作。它有一个预定义clean
指令,允许指定编译后应选择哪些文件。以下调用的文件test.tex
将被编译两次,然后aux
该toc
文件将被删除:
% arara: pdflatex
% arara: pdflatex
% arara: clean: { files: [ test.aux , test.toc ] }
\documentclass{article}
\begin{document}
\tableofcontents
\section{Test}
foo
\end{document}
因为我觉得指定应该删除的整个文件名很麻烦(我必须准备大约 60 个不同的小文件,我想在成功编译后清理目录)我问过@paulo如果有arara
等价于\jobname
% arara: clean: { files: [ \jobname.aux, \jobname.log ] }
这将允许我简单地将arara
指令从一个文件复制到另一个文件。他上来了遵循以下好的规则(再次感谢@paulo):
!config
identifier: remove
name: Remove
command: <arara> @{remove}
arguments:
- identifier: remove
default: <arara> @{isNotEmpty(item, isWindows("cmd /c del", "rm -f").concat(' "').concat(getBasename(file))concat('.').concat(item).concat('"'))}
正确安装此规则后,上述示例变为
% arara: pdflatex
% arara: pdflatex
% arara: remove: { items: [ aux , toc ] }
\documentclass{article}
\begin{document}
\tableofcontents
\section{Test}
foo
\end{document}