Execute o comando do sistema após compilar
Estou usando \immediate\write18{...}para criar um arquivo temporário que é usado no corpo do documento, por exemplo:
\documentclass{beamer}
\immediate\write18{sed 's/foo/bar/' in.tsv > out.tmp}
\begin{document}
% Do stuff with out.tmp
\end{document}
Eu gostaria de excluir o arquivo temporário out.tmpassim que a compilação for concluída, algo como:
\onExit\write18{rm out.tmp}
ou
...
\end{document}
\write18{rm out.tmp}
Isso é possível?
Se for importante, estou compilando com pdflatex --shell-escape slides.tex
Respostas
Você pode usar o atveryendpacote:
\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}
Isso imprimirá "barra" e não haverá nenhum .tmparquivo no final. Mudei os nomes dos arquivos para não correr o risco de destruí-los, mas você pode usar o nome que quiser.
De onde \AtVeryEndDocumentdifere \AtEndDocument? Nesse sentido, é executado quando todos os arquivos são fechados, incluindo o .auxarquivo. Você também pode receber o kernel fornecido \AtEndDocument: faça alguns testes.