如何从LaTeX执行shell脚本?

时间:2010-07-15 06:20:27

标签: shell latex

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

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

我们的想法是在/usr/local/bin/my-shell-script.sh文档处理时执行.tex并将其输出注入LaTeX流。它有可能吗?

6 个答案:

答案 0 :(得分:46)

我会做类似以下的事情(部分由罗马建议的动机):制作你的LaTeX文件

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

并使用

生成文件scriptoutput.tex
/usr/local/bin/my-shell-script.sh > scriptoutput.tex

如果您希望在必要时自动运行,可以在makefile中对此进行编码。或者,您可以使用TeX \write18 command

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

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

答案 1 :(得分:32)

正如David指出的那样,您可以使用\write18来调用外部程序,然后使用\input生成的输出文件。但是,在调用\immediate\write18之前,您可能希望使用\input来确保脚本已执行。

或者,如果您使用较新版本的pdf(la)tex(我认为在1.40之后),您可以使用管道输入命令将输出直接传输到文档中:

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

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

答案 2 :(得分:6)

您可以在TeX中执行此操作。这个paper (PDF)向您展示了如何在TeX中编写和执行病毒。相同的原则适用于执行shell脚本。但是在我看来,编写一个Makefile是更加切实可行的,它在LaTeX运行之前运行并插入结果。

答案 3 :(得分:2)

除非必须在 LaTeX运行时运行脚本,否则我建议您只使用make运行LaTeX并编写脚本。

我使用这种方法为文章添加单词计数,并包括书目参考的统计数据。

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

以下是我的一个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

答案 4 :(得分:2)

在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中有多少个字符,这是文件的一部分(包括在内)。

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

答案 5 :(得分:-1)

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

\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