如何从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