什么是 \immediate 和 \write18 以及如何使用它们?

什么是 \immediate 和 \write18 以及如何使用它们?

它们是什么\immediate\write18如何使用它们?我想要一些从基础到高级场景的示例。

答案1

\immediate都是\writeTeX 基元。该\write操作用于写入文件流。与 TeX 中的许多其他东西一样,文件流是通过数字访问的(尽管通常实际文件会被赋予符号名称以方便使用)。流 18 很“特殊”,因为它根本不是一个文件:相反,它是一种向操作系统(shell)发送命令的方式。

由于 TeX 是一种排版系统,因此的标准行为\write是等到页面被发送出去后再执行任何操作。如果写入操作需要页码之类的内容,那么这就是你想要的。但是,有时你想写现在,这就是\immediate力量。所以

\immediate\write18{<stuff>}

意思是‘<stuff>立即发送给操作系统执行’。

允许在 TeX 文件中执行任意命令存在安全问题,因此 TeX Live 和 MiKTeX 中的标准设置都会关闭对 的完全访问权限\write18。如果您想要完全访问权限,可以使用latex --shell-escape(或类似方法) 代替 来打开它latex

至于使用示例,一个非常有用的例子是在每次运行 LaTeX 时自动运行 BibTeX,方法是将第一行包含在内

\immediate\write18{bibtex8 --wolfgang \jobname}

\write操作会进行扩展,所以\jobname这里会转换成当前TeX文件的名字。

TeX Live 和 MiKTeX 的最新版本有一个“受限”概念,即使没有给出,也\write18允许少数命令工作。此列表非常短,仅包含“安全”命令(其中任意文件操作已被故意禁用)。\write18--shell-escape

答案2

PdfTeX 还有另一种执行系统命令的方法,当我们需要在文档中包含命令的输出时,这很有用:

\input|"ls xyz.*"

将包含用双引号括起来的系统命令的输出。当然,必须给出命令行选项--shell-escape(或对于 MiKTeX)。--enable-write18

在 LaTeX 中使用时,仍然需要使用原语\input,因此构造应该是

\makeatletter
\@@input|"ls xyz.*"
\makeatother

这相当于更复杂的

\immediate\write18{ls xyz.* > temp.dat}
\input{temp.dat}

但不需要临时文件。不幸的是,旧版本的 XeTeX 和 LuaTeX 不知道此语法。

答案3

Joseph 的解释总是很好。我给出这个答案只是为了展示一个例子:elephant.ps 是你可以在 latex 配套示例中找到的图片。

% with pdflatex
\documentclass[]{article}
\usepackage{graphicx}

\begin{document}
\immediate\write18{pstopdf elephant.ps}% to get elephant.pdf
\includegraphics[scale=0.5]{elephant.pdf}
\end{document} 

\immediate\write18与 gnuplot(参见 gnuplottex 的源代码)、maxima、xcas 和 bc 一起使用非常有用。

相关内容