它们是什么\immediate
?\write18
如何使用它们?我想要一些从基础到高级场景的示例。
答案1
和\immediate
都是\write
TeX 基元。该\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 一起使用非常有用。