我正在尝试在LaTeX中做以下操作:
\documentclass{article}
\begin{document}
\execute{/usr/local/bin/my-shell-script.sh}
\end{document}
这个想法是在.tex
文档处理的那一刻执行/usr/local/bin/my-shell-script.sh
脚本,并将其输出注入LaTeX流中。这真的可能吗?
PS. 通过我制作的包iexec
,这是可能的。
我正在尝试在LaTeX中做以下操作:
\documentclass{article}
\begin{document}
\execute{/usr/local/bin/my-shell-script.sh}
\end{document}
这个想法是在.tex
文档处理的那一刻执行/usr/local/bin/my-shell-script.sh
脚本,并将其输出注入LaTeX流中。这真的可能吗?
PS. 通过我制作的包iexec
,这是可能的。
\documentclass{article}
\begin{document}
\input{scriptoutput.tex}
\end{document}
使用以下命令生成名为scriptoutput.tex
的文件:
/usr/local/bin/my-shell-script.sh > scriptoutput.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遇到该命令时立即运行脚本,而不是等到输出页面被写入才运行(更多关于shipout程序的信息,请参见这个问题)。
\immediate\write18
而不是裸的\write18
。没有\immediate
,写操作可能会被缓冲,直到下一次调用shipout例程。 - Henri Menke正如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
。
--tex-option=--shell-escape
而不是仅传递--shell-escape
。否则,您将收到一个晦涩的错误消息:抱歉,但“MiKTeX编译器驱动程序”未成功。 - GuiTeK\input
管道甚至可以与 shell 管道一起使用。例如,\input{|"jq -r .my_key my_file.json | wc"}
可以工作! - rickhg12hs你可以在TeX中完成这个任务。这篇文章(PDF)会向你展示如何在TeX中编写和执行病毒。同样的原理也适用于执行shell脚本。然而,在我看来,编写一个Makefile更加实用,它可以在你运行LaTeX之前运行并插入结果。
pdflatex --enable-pipes --shell-escape mytexfile
使用
%...
[This section currently is
\input{|"wc kmb-box.tex| tr -s ' ' | cut -d' ' -f 4"}
% 2000 characters are allowed here
\input{kmb-box}
%...
这个功能非常好用。也就是说,它使用wordcount(wc)来报告文件kmb-box.tex中有多少个字符,该文件是文档的一部分(包含在内)。
顺便说一句,如果你想要的是单词而不是字符,只需更改“-f 4”中的数字即可。
除非在运行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
这是我使用自己的iexec
软件包的方法:
\documentclass{article}
\usepackage{iexec}
\begin{document}
\iexec{/usr/local/bin/my-shell-script.sh}
\end{document}
\iexec[quiet]{/usr/local/bin/my-shell-script.sh}