Exécuter la commande système après la compilation

Oct 01 2020

J'utilise \immediate\write18{...}pour créer un fichier temporaire qui est utilisé dans le corps du document, par exemple:

\documentclass{beamer}

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

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

Je voudrais supprimer le fichier temporaire out.tmpune fois la compilation terminée, quelque chose comme:

\onExit\write18{rm out.tmp}

ou

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

Est-ce possible?

Si ça compte, je compile avec pdflatex --shell-escape slides.tex

Réponses

2 egreg Oct 01 2020 at 02:43

Vous pouvez utiliser le atveryendpackage:

\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}

Cela affichera «barre» et il n'y aura pas de .tmpfichier à la fin. J'ai changé les noms de fichiers afin de ne pas risquer d'écraser mes fichiers, mais vous pouvez utiliser le nom que vous voulez.

D'où \AtVeryEndDocumentdiffère- \AtEndDocumentt-il? En ce sens, il est exécuté lorsque tous les fichiers sont fermés, y compris le .auxfichier. Vous pourriez également être servi avec le noyau fourni \AtEndDocument: faites quelques tests.