设想
我想创建一个新的环境,例如,
pscanvas
不需要任何大小规范,而只需要一个唯一的文件名。它可以包含任何可以pspicture
包含的图形对象。因此
\begin{pscanvas}{<filename>}% no size specification needed % any graphic objects go here \end{pscanvas}
将简化
\begin{pspicture}(<width>,<height>)% size specification needed as usual % any graphic objects go here \end{pspicture}
或者
\begin{pspicture}(<x1>,<y1>)(<x2>,<y2>)% size specification needed as usual % any graphic objects go here \end{pspicture}
由于 TeX 输入文件中未指定画布大小,因此 TeX 输入文件至少需要编译两次。
第一次编译
latex->dvips->gs
必须生成一个临时文件,例如<filename>.bbi
(bbi
代表边界框信息)。此临时文件是由 GhostScript 在调用嵌入在 中的 PostScript 代码时动态生成的pscanvas
。
第一次编译不需要生成 PDF 输出,因为 TeX 尚未正确准备画布大小。但是,如果我们生成 PDF 输出,PDF 应该会呈现一个通知框,提示“图形生成过早,请再次编译。”。
第二次编译时latex
,TeX 引擎读取 ,<filename>.bbi
为图形腾出精确的空间filename
。然后编译 ,dvips->ps2pdf
生成最终的 PDF 输出。
问题
如何将 PostScript 中画布的边界框信息写入外部文件<filename>.bbi
并从 TeX 世界中读取以准备画布大小?
答案1
我不确定将信息读回 TeX 的要求,但您可以从格式化为 DSC 注释的 ghostscript 中获取边界框信息。
gs -sDEVICE=bbox file.ps
这将针对每个showpage
事件打印 2 行到 stderr。
%%BoundingBox: 51 93 511 731
%%HiResBoundingBox: 51.335998 93.131997 510.209984 730.061978
%%BoundingBox: 23 83 587 765
%%HiResBoundingBox: 23.147999 83.087997 586.331982 764.801977
(当我按下回车键时,出现了不可见的 showpage 提示符,这是多余的空白行。不可见是因为我重定向了 stdout 以获得 stderr 的清晰图像。)
为了将其捕获到文件中,我们需要处理 stderr 句柄。
gs -sDEVICE=bbox file.ps 2>file.bbi
其他一些有用的选项是-dBATCH
:文件后退出(否则它会转到 PS> 提示符),以及-dNOPAUSE
:不要等待在 showpage 处输入。
如果我们可以控制如何处理 shell-out 到 gs,那么可能就可以通过管道传输 postscript 片段而不需要额外的中间文件。
??? | gs -q -sDEVICE=bbox -dNOPAUSE -dBATCH - 2>&1 | ???
这假设 postscript 程序本身不会产生干扰文本输出。