编译后执行系统命令

编译后执行系统命令

我正在使用它\immediate\write18{...}来创建一个在文档主体中使用的临时文件,例如:

\documentclass{beamer}

\immediate\write18{sed 's/foo/bar/' in.tsv > out.tmp}

\begin{document}
% Do stuff with out.tmp
\end{document}

一旦编译完成,我想删除临时文件out.tmp,例如:

\onExit\write18{rm out.tmp}

或者

...
\end{document}
\write18{rm out.tmp}

这可能吗?

如果重要的话,我正在编译pdflatex --shell-escape slides.tex

答案1

您可以使用该atveryend包:

\begin{filecontents*}{\jobname.tsv}
foo
\end{filecontents*}

\documentclass{article}
\usepackage{atveryend}

\immediate\write18{sed 's/foo/bar/' \jobname.tsv > \jobname.tmp}
\AtVeryEndDocument{\immediate\write18{rm \jobname.tmp}}

\begin{document}

\input{\jobname.tmp}

\end{document}

这将打印“bar”,最后不会有.tmp文件。我更改了文件名,以避免破坏我的文件,但您可以使用任何您喜欢的名称。

有什么\AtVeryEndDocument不同\AtEndDocument? 因为它是在关闭所有文件(包括.aux文件)时执行的。 您可能还会得到提供的内核\AtEndDocument:进行一些测试。

相关内容