2010-07-15 34 views
42

Sto cercando di effettuare le seguenti operazioni in LaTeX:Come eseguire script di shell da LaTeX?

\documentclass{article} 
\begin{document} 
\execute{/usr/local/bin/my-shell-script.sh} 
\end{document} 

L'idea è quella di eseguire /usr/local/bin/my-shell-script.sh al momento della .tex elaborazione dei documenti e iniettare la sua uscita nel flusso LaTeX. È possibile a tutti?

+1

Vedi anche http://stackoverflow.com/questions/2671079/how-can-i-save- shell-output-to-a-variable-in-latex –

+3

Divertente come questo è chiuso come 'off topic '. – Orion

risposta

40

vorrei fare qualcosa di simile al seguente (parzialmente motivato b y quello romano suggerito): rendere il vostro file LaTeX sia

\documentclass{article} 
\begin{document} 
\input{scriptoutput.tex} 
\end{document} 

e generare il file scriptoutput.tex utilizzando

/usr/local/bin/my-shell-script.sh > scriptoutput.tex 

Si potrebbe codificare questo in un makefile, se si vuole avere eseguito automaticamente quando necessario. In alternativa, è possibile utilizzare il TeX \write18 command,

\documentclass{article} 
\immediate\write18{/usr/local/bin/my-shell-script.sh > scriptoutput.tex} 
\begin{document} 
\input{scriptoutput.tex} 
\end{document} 

e penso che sarebbe eseguire automaticamente lo script di shell ogni volta che si compila il documento. Lo \immediate è necessario per garantire che lo script venga eseguito quando LaTeX rileva il comando, piuttosto che attendere che venga scritta una pagina di output. (Vedere this question per ulteriori informazioni sulla routine di shipout.)

+0

La tua soluzione è sicuramente più pulita della mia. Il mio è utile se hai molte sostituzioni. –

+2

+1 per l'idea makefile – Gabe

+0

David, molte grazie, questo è esattamente quello che stavo cercando! – yegor256

-1

Non credo sia possibile. Vorrei usare un semplice preprocessore per quello. Cioè modificare il documento di

\documentclass{article} 
\begin{document} 
%%OUTPUT%% 
\end{document} 

e pre-elaborare con

#!/usr/bin/perl -lp 
BEGIN { $output = `/usr/local/bin/my-shell-script.sh`; } 
s/%%OUTPUT%%/$output/g; 

Comando:

perl so.pl template.tex > preprocessed.tex 

o sul posto:

perl -i so.pl template.tex 
1

meno che non sia assolutamente necessario che lo script viene eseguito mentre LaTeX è in esecuzione Suggerirei usando solo make per eseguire LaTeX e script.

Ho usato questo approccio per aggiungere il conteggio delle parole per articoli e includendo le statistiche sui riferimenti bibliografici.

Consenti allo script di generare un file .tex e includerlo nel file sorgente di LaTeX.

Qui di seguito è un frammento da uno dei miei Makefile:

TEX = /usr/texbin/pdflatex 
PREVIEW = /usr/bin/open 

REPORT = SimMon 
REPORT_MASTER = $(REPORT).tex 

TEX_OPTIONS = -halt-on-error 

SimMon: $(REPORT_MASTER) countRefferedPages 
    $(TEX) $(TEX_OPTIONS) $(REPORT_MASTER) 
    @$(PREVIEW) $(REPORT).pdf 

countRefferedPages: BibTeXPageCount 
    cat *.tex | support/BPC/build/Debug/BPC Castle.bib > litteraturTotal.tex 
6

È possibile farlo in TeX. Questo paper (PDF) mostra come scrivere ed eseguire un virus all'interno di TeX. Gli stessi principi si applicano per l'esecuzione di uno script di shell. Tuttavia, a mio parere, è più pratico scrivere un Makefile, che viene eseguito prima dell'esecuzione di LaTeX e inserisce il risultato.

28

Come sottolineato da David, è possibile utilizzare \write18 per chiamare programmi esterni, quindi \input il file di output risultante. Comunque probabilmente vorrai usare \immediate\write18 per assicurarti che lo script sia eseguito prima di chiamare lo \input.

In alternativa, se si utilizzano versioni più recenti di pdf (la) tex (dopo 1,40, credo), è possibile reindirizzare l'output direttamente nel documento, utilizzando un comando di input pipe:

\documentclass{article} 
\begin{document} 
\input{|"/usr/local/bin/my-shell-script.sh"} 
\end{document} 

Per In entrambi i casi è necessario abilitare chiamate di programmi esterne. Per le distribuzioni di TeXlive, è necessario chiamare il latex con l'opzione -shell-escape oppure, per MikTeX, credo che l'opzione sia -enable-write18.

2

Su Ubuntu 11.10 GNU/Linux

pdflatex --enable-pipes --shell-escape mytexfile 

con

... 
[This section currently is 
\input{|"wc kmb-box.tex| tr -s ' ' | cut -d' ' -f 4"} 
/2000 allowed characters] 

\input{kmb-box} 

... 

funziona bene. cioè, questo usa il wordcount (wc) per segnalare quanti caratteri ci sono nel file kmb-box.tex, che fa parte del (incluso nel) documento.

(btw Se si voleva parole piuttosto che personaggi, basta cambiare il numero in "-f 4")

+0

Ottengo errori quando si passa il comando a "ls". C'è un problema con newline nell'output del comando? –

Problemi correlati