如何从LaTeX执行shell脚本?

我正在尝试在LaTeX中执行以下操作:

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

这个想法是在.tex文件处理时执行/usr/local/bin/my-shell-script.sh ,并将其输出注入到LaTeXstream中。 有没有可能?

我会做类似下面的事情(部分由罗马build议的动机):让你的LaTeX文件成为

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

并使用生成文件scriptoutput.tex

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

如果你想让它在需要的时候自动运行,你可以把它编码到一个makefile中。 或者,您可以使用TeX \write18命令 ,

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

而且我认为每次编译文档时都会自动运行shell脚本。 \immediate有必要确保脚本在LaTeX遇到命令时运行,而不是等到写入输出页面。 (有关出货例程的更多信息,请参阅此问题 。)

正如David所指出的那样,您可以使用\write18来调用外部程序,然后\input结果输出文件。 但是,您可能会想要使用\immediate\write18来确保脚本在调用\input之前被执行。

或者,如果您使用pdf(la)tex的更新版本(在1.40之后,我想),您可以使用pipe道input命令将输出直接传送到文档中:

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

对于任何一种方法,您都需要启用外部程序调用。 对于TeXlive发行版,您需要使用-shell-escape选项来调用latex,或者对于-shell-escape ,我相信选项是-enable-write18

你可以在TeX中做到这一点。 本文(PDF)向您展示了如何在TeX中编写和执行病毒。 相同的原则适用于执行shell脚本。 但是在我看来,编写一个Makefile文件是比较可行的,它在LaTeX运行之前运行并插入结果。

在Ubuntu 11.10 GNU / Linux上

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

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

很好地工作。 即,这使用wordcount(wc)报告文件kmb-box.tex中包含多less个字符,该文件是(包含在)文档中的一部分。

(顺便说一句,如果你想要的文字而不是字符,只需改变“-f 4”中的数字)

除非 LaTeX运行脚本运行是必要的,否则我会build议使用make来运行LaTeX和脚本。

我曾用这种方法为文章添加字数统计,并包括书目参考资料的统计。

让脚本生成一个.tex文件,并将其包含在您的LaTeX源文件中。

下面是我的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 

我不认为这是可能的。 我会使用一个简单的预处理器。 即改变文件

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

并用它进行预处理

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

命令:

 perl so.pl template.tex > preprocessed.tex 

或就地:

 perl -i so.pl template.tex