我正在尝试在LaTeX中执行以下操作:
\documentclass{article}
\begin{document}
\execute{/usr/local/bin/my-shell-script.sh}
\end{document}
我们的想法是在/usr/local/bin/my-shell-script.sh
文档处理时执行.tex
并将其输出注入LaTeX流。它有可能吗?
答案 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