\special 如何知道它正在处理哪个输出驱动器?

\special 如何知道它正在处理哪个输出驱动器?

TeXbook 称这\special{…}是一条针对输出驱动器的特殊指令。但是,当你编写指令时,如何知道哪个输出驱动器将读取它?

答案1

\special不知道后端,它只是将东西传递过去。TeXBook 说:

\special <general text>。平衡后的文本被展开并放入“whatsit”项中,并附加到当前列表中。文本最终将出现在文件中,dvi作为对后续软件的指示。

这意味着除了扩展之外<general text>,TeX 不会进行任何后续处理,只是将扩展的内容发送<general text>到 whatsit 节点,该节点按原样包含在(当时仅有的)dvi文件中。

使用较新的引擎,您可以获得不同的输出格式(例如,pdfTeX 和 LuaTeX 上的 PDF,以及xdvXeTeX 上的 PDF),但 TeX 对此一无所知。您(程序员)必须事先知道您要针对哪个后端(通常但并非总是通过知道您在哪个引擎上运行)并在 中编写适当的指令\special

正如 David 所说,这就是为什么处理图形和颜色(例如)的软件包使用包含每个后端指令的驱动程序文件的原因。例如,l3backend-pdftex.def您会发现(类似以下内容):

\cs_new_protected:Npn \__draw_backend_lineto:nn #1#2
  { \__draw_backend_literal:x { #1 ~ #2 ~ l } }

l3backend-dvips.def它看起来像:

\cs_new_protected:Npn \__draw_backend_lineto:nn #1#2
  { \__draw_backend_literal:x { #1 ~ #2 ~ lineto } }

(这里\__draw_backend_literal:x是 的包装器\special)。然后,中更高级的代码l3draw可以简单地用来\__draw_backend_lineto:nn绘制一条线,而不必担心要针对哪个后端。pict2e、TikZ、graphics、xcolor、hyperref、geometry 等软件包都或多或少以相同的方式使用它们自己的特定于后端的文件。

相关内容