![dvips 的“ps:”特殊功能会改变标准 PostScript (bp) 单位吗?](https://linux22.com/image/281801/dvips%20%E7%9A%84%E2%80%9Cps%3A%E2%80%9D%E7%89%B9%E6%AE%8A%E5%8A%9F%E8%83%BD%E4%BC%9A%E6%94%B9%E5%8F%98%E6%A0%87%E5%87%86%20PostScript%20(bp)%20%E5%8D%95%E4%BD%8D%E5%90%97%EF%BC%9F.png)
在基于 的方法开发一些剪辑代码时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
之后。进一步挖掘发现包括@beginspecial
,normalscale
它被定义为反转已应用的缩放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