TeXbook 称这\special{…}
是一条针对输出驱动器的特殊指令。但是,当你编写指令时,如何知道哪个输出驱动器将读取它?
答案1
\special
不知道后端,它只是将东西传递过去。TeXBook 说:
\special
<general text>
。平衡后的文本被展开并放入“whatsit”项中,并附加到当前列表中。文本最终将出现在文件中,dvi
作为对后续软件的指示。
这意味着除了扩展之外<general text>
,TeX 不会进行任何后续处理,只是将扩展的内容发送<general text>
到 whatsit 节点,该节点按原样包含在(当时仅有的)dvi
文件中。
使用较新的引擎,您可以获得不同的输出格式(例如,pdfTeX 和 LuaTeX 上的 PDF,以及xdv
XeTeX 上的 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 等软件包都或多或少以相同的方式使用它们自己的特定于后端的文件。