如何将 PostScript 中的边界框信息写入外部文件并在第二次编译时在 TeX 中读取它?

如何将 PostScript 中的边界框信息写入外部文件并在第二次编译时在 TeX 中读取它?

设想

  • 我想创建一个新的环境,例如,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>.bbibbi代表边界框信息)。此临时文件是由 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 程序本身不会产生干扰文本输出。

相关内容