dvips 的“ps:”特殊功能会改变标准 PostScript (bp) 单位吗?

dvips 的“ps:”特殊功能会改变标准 PostScript (bp) 单位吗?

在基于 的方法开发一些剪辑代码时pgf,我偶然发现了\special{ps:构造的一些奇怪效果dvips。下面几个示例将展示这一点。第一个是进行一些简单的绘制:

\def\squaredemo{%
  newpath
  0 0 moveto
  0 72 lineto
  72 72 lineto
  72 0 lineto
  closepath
  stroke
}

\vbox to 72bp%
  {\special{" \squaredemo}}
\vbox to 72bp%
  {\special{ps: gsave \squaredemo grestore}}
\bye

这两个操作应该是等价的:根据dvips手册,"特殊的形式插入了保存/恢复,但除此之外与相同ps:。但是,两者的输出不同:第二种情况下的正方形要小得多。

第二种情况,也是导致我出现这种情况的情况,是在进行一些剪辑时看到的:

\newbox\tmpbox

\setbox\tmpbox=\hbox{\vrule width 1in height 1in depth 0 in }
\noindent\box\tmpbox

\setbox\tmpbox=\hbox{\vrule width 1in height 1in depth 0 in }
\setbox\tmpbox=\hbox{%
  \special{ps:gsave}%
  \special{
    ps:
      currentpoint
      currentpoint translate
      /savedmatrix matrix currentmatrix def
      Resolution 72 div VResolution 72 div scale
      0 0 36 -72 rectclip
      savedmatrix setmatrix
      neg exch neg exch translate
  }%
  \wd\tmpbox 0pt %
  \rlap{\box\tmpbox}%
  \special{ps:grestore}%
  \hskip 0.5in %
}
\noindent\box\tmpbox 

\setbox\tmpbox=\hbox{\vrule width 1in height 1in depth 0 in }
\setbox\tmpbox=\hbox{%
  \special{ps:gsave}%
  \special{
    ps:
      currentpoint
      currentpoint translate
      /savedmatrix matrix currentmatrix def
      Resolution VResolution scale
      0 0 0.5 -1 rectclip
      savedmatrix setmatrix
      neg exch neg exch translate
  }%
  \wd\tmpbox 0pt %
  \rlap{\box\tmpbox}%
  \special{ps:grestore}%
  \hskip 0.5in %
}
\noindent\box\tmpbox
\bye

请注意,为了使剪辑正常运行,您需要按某个因子进行缩放,该因子似乎是Resolution

所以问题是为什么会发生这种情况:标准 PostScript 单位应该是大点。这是内置的吗dvips?是特定于ps:特殊情况的吗?还是我在某个地方犯了错误?

答案1

解决这个谜题的线索是分辨率设置config.ps:我这里是 600 dpi。经过一些实验,我们发现,这里“正确”所需的比例大约是 8.333,IE600/72 或 600 dpi 图像所需的每个 PostScript 点的点数。

仔细阅读 PostScript 文件,你会发现其中有一小段内容:

TeXDict begin 39158280 55380996 1000 600 600 (test.dvi)
@start end

然后,如果您查看 的定义@start,就会发现它600分别将这里的两个选为水平和垂直分辨率。可以使用固定比例并改变这些值来验证这一点。

实际情况是,dvips设置为使用此分辨率来包含材料,但当您使用"特殊语法的“快捷方式”时,它会插入到@beginspecial @setspecial您的代码之前和@endspecial之后。进一步挖掘发现包括@beginspecialnormalscale它被定义为反转已应用的缩放dvips(并且还允许\mag)。

因此,某种形式的缩放操作是绝对必要的。使用“手工编码”缩放的方法(如问题中所述)显然有效。在或调用中颠覆@beginspecial/是可能的,但这似乎并不简单,因为根据情况,幕后还会发生“额外”的事情。这在 PostScript 文件的原始编辑中是可行的,但似乎只在更简单的第一个示例中的 TeX 文件中有效,而在剪辑情况下则无效。@endspecial\special{ps:\special{ps::

重要的是,这种行为的变化似乎没有记录在dvips手册中。

答案2

查看 ps 文件。如果插入缩放比例,600 72 div dup scale您将获得相同的结果。

 gsave newpath 
 600 72 div dup scale 
0 0 moveto 0 72 lineto 72 72 lineto 72 0 lineto closepath
stroke grestore

或者:

\vbox to 72bp%
  {\special{ps: gsave 600 72 div dup scale \squaredemo grestore}}

正确的内部值是 /DVImag 和 /Resolution

相关内容