如何从 (Xe)(La)TeX 执行外部命令?

如何从 (Xe)(La)TeX 执行外部命令?

我正在尝试捕获 XeLaTeX 文档中外部命令的输出。根据https://tex.stackexchange.com/a/20566/28067https://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 中未知,但没有造成任何损害)。

相关内容