![如何从 (Xe)(La)TeX 执行外部命令?](https://linux22.com/image/282078/%E5%A6%82%E4%BD%95%E4%BB%8E%20(Xe)(La)TeX%20%E6%89%A7%E8%A1%8C%E5%A4%96%E9%83%A8%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我正在尝试捕获 XeLaTeX 文档中外部命令的输出。根据https://tex.stackexchange.com/a/20566/28067和https://stackoverflow.com/a/8929976/256361,我专门做
\documentclass[a5paper]{article}
\usepackage{polyglossia}
\setdefaultlanguage{english}
\begin{document}
A A A
\immediate\input{|"node -v"}
B B B
\end{document}
我正在运行 TeX 来xelatex --enable-write18 --enable-pipes write18.tex
启用通常被阻止的功能(因为安全)。
但是,这似乎不起作用。我尝试过\input
带括号和不带括号的命令,以及带括号和不带括号的命令\immediate
,但只要该行在源代码中,XeLaTeX 就会用
(./write18.aux
)
而不是
(./write18.aux) )
Output written on write18.pdf (1 page).
Transcript written on write18.log.
(即有一个额外的换行符,并且输出在没有剩余行的情况下停止)。观察我的系统,的输出node -v
是完全无危险的字符串v0.11.7
。我理解为了捕获更任意的输出我必须摆弄 catcodes,但这是另一个问题的引子。
那么我在这里做错了什么?
更新@egreg 你可能是对的!我试过了
\immediate\write18{node -v > /tmp/temp.dat}
\input{/tmp/temp.dat}
这确实有效。有趣的是,你在评论中告诉读者https://tex.stackexchange.com/a/20566/28067“在 TeX Live 2013 中,该语法\input|"command"
也受 XeTeX 支持”——你错了吗?
顺便说一句,在 TeXLive 中,使用不受支持的命令行选项似乎不会触发错误消息,这并不能真正帮助简化测试。同样有趣的是http://docs.miktex.org/manual/xetex.html所有长选项都以两个破折号为前缀,而xelatex --help
它们只带有一个破折号(甚至没有提到还有更多可用选项)。
答案1
我用过这个
\documentclass{article}
\begin{document}
\makeatletter
\@@input|"dir"
\end{document}
这给了我一些错误,因为的输出dir
还包含一个带反斜杠的路径,但除此之外,还做了预期的事情:我得到了 12 页或多或少合理的输出(我的测试文件夹很大 ;-))。我用 调用了 xelatex --enable-pipes --shell-excape
。它在 Windows 上与 miktex 和 TL 2013 一起工作。(--enable-pipes
在 texlive 中未知,但没有造成任何损害)。