2010-07-15 11 views
42

Ich versuche, die folgend in LaTeX zu tun:Wie man Shell-Skript von LaTeX aus ausführt?

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

Die Idee ist /usr/local/bin/my-shell-script.sh im Moment der .tex Dokumentenverarbeitung auszuführen und die Ausgabe in LaTeX Strom zu injizieren. Ist es überhaupt möglich?

+1

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

+3

Lustig, wie das als Off-Thema geschlossen ist. – Orion

Antwort

40

ich tun würde, so etwas wie die folgenden (teilweise motiviert b y, was Roman vorgeschlagen): machen Sie Ihre LaTeX-Datei

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

und erzeugen Sie die Datei scriptoutput.tex mit

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

Sie könnte dies in einer Make-Datei verschlüsseln, wenn Sie es bei Bedarf automatisch ausgeführt haben wollen. Alternativ können Sie die TeX \write18 command,

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

und ich denke, die automatisch das Shell-Skript jedes Mal, wenn Sie das Dokument kompilieren laufen würde. Die \immediate ist erforderlich, um sicherzustellen, dass das Skript ausgeführt wird, wenn LaTeX den Befehl findet, anstatt zu warten, bis eine Seite der Ausgabe geschrieben wird. (Siehe this question für mehr auf der shipout Routine.)

+0

Ihre Lösung ist sicherlich sauberer als meine. Meins ist praktisch, wenn Sie viele Auswechslungen haben. –

+2

+1 für Makefile Idee – Gabe

+0

David, vielen Dank, das ist genau das, was ich gesucht habe! – yegor256

-1

Ich glaube nicht, dass das möglich ist. Ich würde dafür einen einfachen Präprozessor verwenden. I.e. ändern, das Dokument zu

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

und Vorprozess mit

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

Befehl:

perl so.pl template.tex > preprocessed.tex 

oder an Ort und Stelle:

perl -i so.pl template.tex 
1

Es sei denn, es ist zwingend notwendig, dass das Skript ausgeführt wird, während LaTeX läuft würde ich empfehlen make nur mit LaTeX und Sie Skript auszuführen.

Ich habe diesen Ansatz verwendet, um Wörter für Artikel und Statistiken zu bibliographischen Referenzen hinzuzufügen.

Lassen Sie Ihr Skript eine .tex Datei erzeugen und diese in Ihre LaTeX-Quelldatei einbinden.

Unten ist ein Ausschnitt aus einem meiner Makefiles:

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

du in TeX tun können. Diese paper (PDF) zeigt Ihnen, wie Sie einen Virus in TeX schreiben und ausführen. Die gleichen Prinzipien gelten für die Ausführung eines Shell-Skripts. Meiner Meinung nach ist es jedoch praktikabler, ein Makefile zu schreiben, das vor dem Start von LaTeX läuft und das Ergebnis einfügt.

28

Wie David darauf hingewiesen hat, können Sie \write18 verwenden, um externe Programme aufzurufen, dann \input die resultierende Ausgabedatei. Wahrscheinlich möchten Sie jedoch \immediate\write18 verwenden, um sicherzustellen, dass das Skript vor dem Aufruf der \input ausgeführt wird.

Alternativ, wenn Sie neuere Versionen von pdf (la) tex verwenden (nach 1,40, glaube ich), können Sie die Ausgabe mittels Pipelining direkt in das Dokument, das von einem verrohrt Eingang Befehl:

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

Für Bei beiden Methoden müssen Sie externe Programmaufrufe aktivieren. Für TeXlive-Distributionen müssen Sie Latex mit der -shell-escape Option aufrufen, oder für MikTeX glaube ich, dass die Option -enable-write18 ist.

2

auf Ubuntu 11.10 GNU/Linux

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

mit

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

\input{kmb-box} 

... 

funktioniert gut. Das heißt, es wird mit wordcount (wc) angegeben, wie viele Zeichen in der Datei kmb-box.tex enthalten sind, die Teil des Dokuments ist.

(btw Wenn Sie also eher als Zeichen wollte, ändern Sie einfach die Nummer in "-f 4")

+0

Ich bekomme Fehler, wenn ich den Befehl auf "ls" umschalte. Gibt es ein Problem mit Zeilenumbrüchen in der Ausgabe des Befehls? –

Verwandte Themen