Execute o comando do sistema após compilar

Oct 01 2020

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

2 egreg Oct 01 2020 at 02:43

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.