预览包到底施展了什么样的“魔法”来产生紧密的纸张尺寸?

预览包到底施展了什么样的“魔法”来产生紧密的纸张尺寸?

preview实际上,一旦我知道了包的存在,以下看起来像重新发明轮子的方法就被抛弃了。

% WithoutPreview.tex
\documentclass{article}
\usepackage{pstricks}

\newcommand\All{0.1}
\newcommand\Left{-\All}
\newcommand\Right{\All}
\newcommand\Bottom{-\All}
\newcommand\Top{\All}


%%%%%%%%%%%% BEGIN SETTINGS %%%%%%%%%%%%
\headheight=0pt
\headsep=0pt
\parindent=0pt
\topskip=0pt

\topmargin=-72.27pt
\oddsidemargin=-72.27pt
\paperwidth=\dimexpr\Right\psxunit-\Left\psxunit\relax
\paperheight=\dimexpr\Top\psyunit-\Bottom\psyunit\relax

\special{papersize=\the\paperwidth,\the\paperheight}
\pagestyle{empty}
%%%%%%%%%%%%% END SETTINGS %%%%%%%%%$%%%



\begin{document}
\begin{pspicture}(\Left,\Bottom)(\Right,\Top)
\psframe[linewidth=0.01](\Left,\Bottom)(\Right,\Top)
\end{pspicture}
\end{document}

其理念WithoutPreview.tex是产生具有紧密纸张尺寸的单一输出。

使用以下批处理文件,

rem batch.bat takes an input file name WITHOUT extension.
latex %1
dvips -D10000 -t unknown %1
gswin32c -r10000 -dAutoRotatePages=/None -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=%1.pdf %1.ps

我得到了以下不够紧密的输出。

在此处输入图片描述

注意:边缘处有随机的空白。无法预测它们的确切位置。它们有时在左侧和顶部边缘,有时在左侧和底部边缘等。它们取决于指定的设置。

一旦我知道了包的存在preview并使用它,我就放弃了我在中使用的方法WithoutPreview.tex

以下代码使用preview包,

% WithPreview.tex
\documentclass{article}
\usepackage{pstricks}

\newcommand\All{0.1}
\newcommand\Left{-\All}
\newcommand\Right{\All}
\newcommand\Bottom{-\All}
\newcommand\Top{\All}

%%%%%%%%%%%% BEGIN SETTINGS %%%%%%%%%%%%
\usepackage[active,tightpage]{preview}
\PreviewBorder=0pt
\PreviewEnvironment{pspicture}
%%%%%%%%%%%%% END SETTINGS %%%%%%%%%$%%%

\begin{document}
\begin{pspicture}(\Left,\Bottom)(\Right,\Top)
\psframe[linewidth=0.01](\Left,\Bottom)(\Right,\Top)
\end{pspicture}
\end{document}

当使用相同的批处理文件进行编译时,batch.bat它会产生如下的紧密输出。

在此处输入图片描述

注意:随机空白已经消失了!

昨天传来坏消息,因为我无法将preview这个包与 PSTricks 相关包和animate包一起使用。

问题

是否在后台preview调用?如果不调用,它会施展什么样的魔法来产生紧凑的纸张尺寸?我感兴趣的是提取用于产生紧凑纸张尺寸的片段代码,并将其插入到我的 中。pdfcroppreviewpdfcroppreviewWithoutPreview.tex

注意:xelatex可以提供比 does 更好的输出latex-dvips-ps2pdf,但是xelatex运行速度太慢。

另一点需要注意的是:preview软件包忽略了\pagecolor{<non-white color>}序言中声明的内容。不过,这不是什么大问题,因为非白色背景可以通过 PSTricks 获得psframe*[linecolor=<non-white>](...,...)(...,...)

答案1

preview 不会调用 pdfcrop。以下是插入到您的示例中的 preview 相关代码。您可以清楚地看到,它只是获取 sp 中的 tex 框大小,然后使用相关转换因子 (65781.76) 将其转换为 postscript 页面大小:

\documentclass{article}
\usepackage{pstricks}

\newcommand\All{0.1}
\newcommand\Left{-\All}
\newcommand\Right{\All}
\newcommand\Bottom{-\All}
\newcommand\Top{\All}

\makeatletter
\newbox\prv

\begin{document}
    \setbox\prv\vbox{\noindent
       \begin{pspicture}(\Left,\Bottom)(\Right,\Top)
        \psframe[linewidth=0.01](\Left,\Bottom)(\Right,\Top)
        \end{pspicture}
    \par\unskip\setbox0\lastbox
    \nointerlineskip\hbox{\unhbox0}%
    }
   \voffset=-\ht\prv
   \hoffset=0pt\relax
   \shipout\vbox{%
      \@begindvi
      \special{!userdict begin/preview-bop-level 0 def%
      /eop-hook{/preview-bop-level dup load dup 0 gt{1 sub}if store}bind def
      /bop-hook{preview-bop-level 0 le{7{currentfile token not{stop}if
       65781.76 div DVImag mul}repeat 72 add 72 2 copy gt{exch}if 4 2 roll
       neg 2 copy lt{exch}if dup 0 gt{pop 0 exch}
      {exch dup 0 lt{pop 0}if}ifelse 720 add exch 720 add 3 1 roll
      4{5 -1 roll add 4 1 roll}repeat
      <</PageSize[5 -1 roll 6 index sub 5 -1 roll 5 index sub]%
       /PageOffset[7 -2 roll [1 1 dtransform exch]%
       {0 ge{neg}if exch}forall]>>setpagedevice}if%
      /preview-bop-level dup load dup 0 le{/isls false def%
          /vsize 792 def/hsize 612 def}if 1 add store}bind def end}
     \special{ps::0 0 0 0
     \number\ht\prv \space\number\dp\prv \space\number\wd\prv \space}
     \box\prv
}
\end{document}

相关内容