如何删除 dvips 生成的 EPS 文件中的 PSTricks 字典或库代码?

如何删除 dvips 生成的 EPS 文件中的 PSTricks 字典或库代码?

我有两种互斥的方法来生成 EPS 格式的裁剪 PSTricks 图形:

  1. 使用latex input.tex后跟dvips input.dvi -E -o output.eps
  2. 或者使用latex input.tex后跟dvips input.dvi后跟ps2pdf input.ps后跟pdfcrop --hires input.pdfpdftops -eps input-crop.pdf

为了便于说明,我选择以下代码片段作为输入文件。

% gridon.tex
\documentclass{minimal}
\usepackage{pstricks}

\pagestyle{empty}
\begin{document}

\begin{pspicture}[showgrid=true](3,3)
\pscircle(1.5,1.5){1}
\rput[tr](3,3){3}
\end{pspicture}

\end{document}

第一种方法

我注意到第一种方法生成的 EPS 文件的大小比第二种方法生成的 EPS 文件大 4 倍。

我打开了第一种方法生成的EPS,内容如下:

%!PS-Adobe-2.0 EPSF-2.0
%%边界框:85 626 184 729
%%高分辨率边界框:85.272 626.784 183.390 728.016
%%创建者:dvips(k) 5.99 版权所有 2010 Radical Eye Software
%%标题:gridon.dvi
%%创建日期:2011 年 7 月 6 日星期三 22:32:55
%%文档字体:CMR10
%%结束评论
%DVIPS网页:(www.radicaleye.com)
%DVIPS命令行:dvips gridon -E* -o gridon-crop.eps
%DVIPS参数:dpi=600
%DVIPSSource: TeX 输出 2011.07.06:2232
%%BeginProcSet: tex.pro 0 0
%!
/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
N}B/A{重复}B/TR{翻译}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
landplus90{V分辨率 72 div vsize mul 0 exch}{分辨率 -72 div hsize
mul 0}如果否则 TR}如果分辨率 VResolution vsize -72 div 1 添加 mul TR[
矩阵 currentmatrix{AA 回合子 abs 0.00001 lt{回合}if}forall 回合
exch 回合 exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 字典 N nn 开始
/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N 字符串/base X 数组
/位图 X/BuildChar{CharBuilder}N/Encoding IEn N 结束 A{/foo setfont}2
数组复制 cvx N 加载 0 nn 放入/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
df-尾部}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-尾部}B/E{pop nn A
definefont setfont}B/Cw{Cd A 长度 5 sub get}B/Ch{Cd A 长度 4 sub get
}B/Cx{128 Cd A 长度 3 子获得子}B/Cy{Cd A 长度 2 子获得 127 子}
B/Cdx{Cd A 长度 1 子获取}B/Ci{Cd A 类型/stringtype ne{ctr 获取/ctr ctr
1 添加 N}if}B/CharBuilder{save 3 1 滚动 SA/base 获取 2 索引获取 S
/BitMaps 获取 S 获取/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw 添加 Cy
设置缓存设备 Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}图像掩码
恢复}B/D{/cc XA 类型/字符串类型 ne{]}如果 nn/base 获取 cc ctr 放入 nn
/BitMaps 获取 S ctr S sf 1 ne{AA 长度 1 sub A 2 索引 S 获取 sf div 放入
}if put/ctr ctr 1 添加 N}B/I{cc 1 添加 D}B/bop{userdict/bop-hook 已知{
bop-hook}if/SI 保存 N @rigin 0 0 移动到/V 矩阵当前矩阵 A 1 获取 A
mul exch 0 get A mul add .99 lt{/QV}RV}ifelse load def pop pop}N/eop{
SI 恢复 userdict/eop-hook 已知{eop-hook}如果 showpage}N/@start{
userdict/start-hook 已知{start-hook}if pop/VResolution X/Resolution X
1000 div/DVImag X/IEn 256 数组 N 2 字符串 0 1 255{IEn SA 360 添加 36 4
索引 cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
/dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3
def}B/p{dir 2 eq{-90 旋转显示 90 旋转}{dir 3 eq{-90 旋转显示 90
旋转}{显示}如果否则}如果否则}N/RMat[1 0 0 -1 0 0]N/BDot 260 字符串 N/Rx 0
N/Ry 0 N/V{}B/RV/v{/Ry X/Rx XV}B statusdict begin/product where{pop
false[(Display)(NeXT)(LaserWriter 16/600)]{A 长度乘积长度 le{A
长度产品exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}
forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{
BDot}图像掩码 grestore}}{{gsave TR -.1 .1 TR Rx Ry 比例 1 1 false RMat
{BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch
圆形交换变换移动到 Rx 0 rlineto 0 Ry neg rlineto Rx neg 0
rlineto 填充 grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B
/M{S p delta 添加尾部}B/b{S p 尾部}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}
B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p
-3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{
0 S rmoveto}B/y{3 2 roll pa}B/bos{/SS 保存 N}B/eos{SS 恢复}B 结束

%%结束进程集
%%BeginProcSet: pstricks.pro 0 0
% $Id: pstricks.pro 455 2011-01-30 11:19:19Z herbert $
%% pstricks.tex 的 PostScript 序言。
%% 版本 1.07,2009/04/30
%%
%% 本程序可根据条款重新分发和/或修改
%% LaTeX 项目公共许可证 由 CTAN 档案库分发
%% 在目录 macros/latex/base/lppl.txt 中。
% 如果不知道,则定义以下 gs 函数,例如使用蒸馏器时
systemdict /.setopacityalpha 已知不为 {/.setopacityalpha { pop } def } if
systemdict /.setblendmode 已知不 {/.setblendmode { pop } def } 如果
systemdict /.setshapealpha 已知不为 {/.setshapealpha { pop } def } if
/tx@Dict 200 dict def % 主 PSTricks 词典
tx@Dict 开始
/ADict 25 dict def % 箭头字典
/CM { 矩阵 currentmatrix } 绑定 def
/SLW /setlinewidth 加载 def
/CLW /currentlinewidth 加载 def
/CP /currentpoint 加载 def
/ED { 交换 def } 绑定 def
/L /lineto 加载 def
/T /翻译加载 def
/TMatrix { } def
/RAngle { 0 } def
/Sqrt { dup 0 lt { pop 0 } { sqrt } ifelse } def % 对于负数参数返回 0
/Atan { /atan 加载已停止 { pop pop 0 } if } def % 如果 atan 未知则返回 0
/ATAN1 {neg -1 atan 180 sub } def % atan(x) (只有一个参数)
/Div { dup 0 eq { pop } { div } ifelse } def % 控制除法
/tan { dup cos abs 1.e-10 lt
  { pop 1.e10 } % 返回 1.e10 作为无穷大
  { dup sin exch cos div } ifelse % 默认 sin/cos
}定义
/Tan { dup sin exch cos Div } def % sin(x)/cos(x) x 以度为单位
/Acos {dup dup mul neg 1 add dup 0 lt { % 反余弦,当为负根时返回 0
  pop pop 0 }{ sqrt exch atan} ifelse } def
/NET { neg exch neg exch T } def % 将坐标系更改为负坐标系      
/Pyth { dup mul exch dup mul add sqrt } def % 毕达哥拉斯,需要 2 个参数
/Pyth2 { % 毕达哥拉斯,xA yA xB yB
  3 -1 滚动 % xA xB yB yA
  子 % xA xB yB-yA
  3 1 滚动 % yB-yA xA xB
  子 % yB-yA xA-xB
  Pyth } def
/PtoC { 2 copy cos mul 3 1 roll sin mul } def % 极坐标转换为笛卡尔坐标
/Rand { rand 4294967295 div } def % 一个真正的随机数
%----------------- hv 添加 20050516 ---------------
/PiDiv2 1.57079632680 def
/Pi 3.14159265359 def
/TwoPi 6.28318530718 def
/欧拉 2.71828182846 def
%/e 欧拉绑定定义
/RadtoDeg { 180 mul Pi div } bind def % 将弧度转换为角度
/DegtoRad { Pi mul 180 div } bind def % 反之亦然
%----------------- hv 结束------------------------------
/PathLength@ { /zzy y1 sub x x1 sub Pyth add def /y1 y def /x1 x def } def
/路径长度 {
  flattenpath /z 0 def
  { /y1 ED /x1 ED /y2 y1 def /x2 x1 def }
  { /y ED /x ED 路径长度@ }
  {}
  { /y y2 def /x x2 def 路径长度@ }
  /pathforall load 已停止 { pop pop pop pop } 如果
}定义
/STP { .996264 重复比例 } def % BP/PT 缩放
/STV { SDict 开始正常比例结束 STP } def %
/虚线 {
    重复 0 gt
    {/a .5 def PathLength exch div }
    { pop /a 1 def PathLength } 如果否则
    /b ED % 图案应均匀地适合 b
    dup /X ED % 模式数组
    0 获取 /y ED %第一个黑色段的长度
    /z 0 X {add} forall def %完整模式的长度
    %% 缩放因子的计算如 van Zandt 所述:
    ba .5 sub 2 mul y mul sub z Div 圆形
    z mul a .5 sub 2 mul y mul add b exch Div
    %%%% 堆栈上的缩放因子。
    /z ED %%现在,z 是缩放因子
    下面的长度测试为 false %
    X { z mul } forall X astore %% 修改 TN 04-08-07
    %%% 检查 X 中是否至少有一个破折号的长度为正数:
    {0 gt 或} forall
    { X 1 a 乘以 y }
    { [ 1 0 ] 0 }
    如果别的
    划线描边
}定义
/点线{
  /b PathLength def
  /a ED /z ED /y CLW def
  /zyz 添加防御
  一个 0 gt {
    /bba div def
  }{
    0 当量{
      /bby sub def
    }{a-3当量{
      /bby 添加 def } 如果
    } 如果别的
  } 如果别的
  [ 0 bbz Div round Div dup 0 le { pop 1 } if ]
  a 0 gt { 0 }{ y 2 div a -2 gt { neg }如果 } 如果否则
  setdash 1 setlinecap 描边
}定义
/SymbolLine { % 在堆栈上 [ xyxy ...
  counttomark % 元素数量
  2 div cvi /n ED % n 对
  /YA ED /XA ED % 起点
  n 1 子 {
    /YB ED /XB ED
    /XLength XB XA 子定义
    /YLength YB YA 子防御
    /PAngle YLength XLength Atan def
    /XYLength XLength YLength Pyth def
    /nSym XYLength SymStep div cvi def
    /Shift 符号 stringwidth pop 2 div def
    /deltaX XLength nSym div def
    /deltaY YLength nSym div def
    XA Shift 子菜单 YA Shift 子菜单移至
    nSym {
      gsave rotateSymbol { PAngle 180 子 CorrAngle 子旋转 } 如果
      符号显示
      格雷斯托
      deltaX deltaY 移动
    } 重复
    /YA YB 防御 /XA XB 防御
  } 重复
  XA Shift 子菜单 YA Shift 子菜单移至
  gsave rotateSymbol { PAngle 180 子 CorrAngle 子旋转 } 如果
  符号显示 grestore
  pop %删除标记符号
}定义
/LineFill { % hv ------------ 补丁 7 -------------
  保存
  abs/hatchWidthInc ED
  abs/hatchSepInc ED
  abs CLW 添加 /a ED
  a 0 dtransform 圆形交换 圆形交换
  2 复制 idtransform
  交换 Atan 旋转
  idtransform pop /a ED
  .25 .25 itransform 路径框
  /y2 ED
  a Div 上限 cvi /x2 ED /y1 ED
  a Div cvi /x1 ED /y2 y2 y1 sub def
  夹子
  新路径
  2 设置线帽
  系统字典
  /setstrokeadjust 已知 { true setstrokeadjust } 如果
  x2 x1 子 1 添加 {
    x1 a mul y1 移动到 0 y2 rline 移动到描边
    /x1 x1 1 添加
      hatchWidthInc 0 gt { CLW 添加 } 如果
    定义
    hatchSepInc 0 gt hatchWidthInc 0 gt 或 {
      /aa hatchSepInc 添加 def
      CLW hatchWidthInc 添加 SLW
    } 如果
  } 重复
  格雷斯托
  啪啪 } def
/PenroseFill {% 堆栈上:缩放因子
  dup dup 比例
  1 exch div 回合 /penroseFactor ED
  a 0 dtransform 圆形交换 圆形交换
  2 复制 idtransform
  交换 Atan 旋转
  idtransform pop /a ED
  .25 .25 itransform 路径框
  /y2 ED
  a Div 上限 cvi /x2 ED /y1 ED
  a Div cvi /x1 ED /y2 y2 y1 sub def
  夹子
  新路径
  系统字典
  /setstrokeadjust 已知 { true setstrokeadjust } 如果
  /I/S/L/W/G/+/Z/F/E/D[/def/exch/for{ED}/add{s E get mul}
 { Z -36.2001 1 33 }{25 ES rlineto}{Z dup q GE q 1 + G}{Z 2 2}]{cvx def}forall
  [0 72 1008 {dup sin E cos }F ]1 setlinejoin/s W{/a W{/b I 10{/i I 4{/m I moveto
  im +/j I 10{/l Z bml + G al G sub sm 获取 div .2 + floor .3 + 25
  mul jl + S rmoveto}F i L j L 划线 }F}F}F}F
  格雷斯托
  啪啪
}定义
/TruchetFill { % 堆栈:缩放因子
  10 字典开始
  dup dup 比例
  1 exch div 回合 /penroseFactor ED
  a 0 dtransform 圆形交换 圆形交换
  2 复制 idtransform
  交换 Atan 旋转
  idtransform pop /a ED
  .25 .25 itransform 路径框
  /y2 ED
  a Div 上限 cvi /x2 ED /y1 ED
  a Div cvi /x1 ED /y2 y2 y1 sub def
  夹子
  新路径
  系统字典
  /setstrokeadjust 已知 { true setstrokeadjust } 如果
  /ma 负面防御
  /ha a 2 div def
  /mha ha neg def
  /瓦 {
    rand dup 2 idiv 2 mul eq { 90 旋转 } if
    mha mha moveto ha mha lineto
    哈哈 lineto 哈哈 lineto
% closepath .1 设置线宽描边
    内容
  }定义
  /内容{
    0 ha moveto ha 0 lineto
    0 mha moveto mha 0 lineto
% 1 设置线宽
  }定义
  /dotiling {
    f ma mul afa mul {
      /i 交换防御
      f ma mul afa mul {
        /j 交换 def
        gsave ij 翻译
        瓷砖描边 grestore
      } 为了
    } 为了
  }定义
  /f 3 防御
  5 斯兰特 dotiling
  end % 本地用户字典
}定义
/开始箭头{
  ADict begin % 将其保存在本地,结束见 EndArrow
  /@mtrx CM def
  保存
  2 副本
  2 指数子负交换
  3 指数子交易所 Atan
  旋转新路径
}定义
/EndArrow { @mtrx setmatrix CP grestore end } def % 结束 ADict
/箭 {
  CLW 乘以加法重复
  2 分度/带 ED
  多次重复 /h ED
  多/一个 ED
  { 0 h T 1 -1 比例 } 如果
  负面举动
  0 0 L wh L w neg a negrlineto
  gsave 填充 grestore
}定义
/ArrowD { % 边画成曲线 (hv 20071211)
  CLW 乘以加法重复
  2 分度/带 ED
  多次重复 /h ED
  多重/插入 ED
  { 0 h T 1 -1 scale } if % 改变方向
% 我们使用 y=w/h^2 * x^2 作为控制点的方程
% 表示箭头从上到下的坐标
% 底部(尖端)是 (0;0)
  w neg h moveto % 左下角 >
  w 9 div 4 mul neg h 3 div 2 mul
  w 9 div 负 h 3 div  
  0 0 曲线至 % 尖端 >
  宽 9 格 高 3 格  
  w 9 div 4 乘以 h 3 div 2 乘以
  wh curveto % 左上角 >
  w neg Inset neg rlineto %移动到x=0并插入
  gsave 填充 grestore
}定义
/Tbar {
  CLW mul add /z ED
  z -2 div CLW 2 div 移动到
  z 0 rlineto 笔划
  0 CLW 移至
}定义
/括号 {
  CLW 乘以加法重复 CLW 乘以 2 除法
  /x ED mul CLW add /y ED /z CLW 2 div def
  x 负 y 移至
  x 负 CLW 2 div L x CLW 2 div L xy L 行程
  0 CLW 移至
}定义
/圆括号 {
  CLW 乘以加法重复2除法
  /x ED mul /y ED /mtrx CM def
  0 CLW 2 div T xy mul 0 ne { xy 比例 } if
  1 1 移至
  .85 .5 .35 0 0 0 曲线
  -.35 0 -.85 .5 -1 1 曲线
  mtrx 设置矩阵描边 0 CLW 移动到
}定义
/SD { 0 360 弧形填充 } def
/EndDot { % DS 是点大小
  { /z DS def } { /z 0 def } ifelse % 外尺寸或内尺寸
  /b ED % 颜色定义
  0 DS SD
  b { 0 z DS CLW sub SD } 如果
  0 DS z 添加 CLW 4 div sub
  搬去
}定义
/Shadow { [ { /moveto 加载 } { /lineto 加载 } { /curveto 加载 } {
  /closepath load } /pathforall load ceased { pop pop pop pop CP /moveto
  加载 } if ] cvx newpath 3 1 roll T exec } def
/NArray { % 保存坐标,并在堆栈顶部显示点布尔值
  /显示点 ED
  counttomark 2 div dup cvi /n ED % n 2 div 堆叠
  n eq not { exch pop } if % 点数为偶数?删除一个
  展示点
    { ] 负载 / 积分 ED }
    { n 2 mul 1 add -1 roll pop } ifelse %删除标记符号
}定义
/线 {
  NArray n 0 eq 不
    { n 1 eq { 0 0 /n 2 def } if ArrowA /nn 2 sub def
      n { 行到 } 重复
      CP 4 2 滚动 ArrowB L 弹出
    } 如果
}定义
/LineToYAxis {
  NArray % 堆栈上的所有 xy 对
  n { 2 copy moveto % 转到当前点
    0 exch Lineto % 线到 y 轴
    pop % 删除旧的 x 值
  } 重复
}定义
/LineToXAxis{
  NArray % 堆栈上的所有 xy 对
  n 0 eq 不
    { n 1 eq { 0 0 /n 2 def } 如果
      箭头A
      /nn 2 子防御
      CP 2 复制 移至 弹出 0 行至
      n { 2 复制 移至 弹出 0 行至 } 重复
      CP
      4 2 卷
      箭头B
      2 复制移动至弹出 0
      大号
      弹出 弹出 } 如果
}定义
/Arcto {
  /a [ 6 -2 滚动 ] cvx def
  应收账
  /arcto 加载已停止 { 5 } { 4 } ifelse { pop } repeat
  A
}定义
/检查关闭 {
  重复 n 2 乘以 1 子索引 eq 2 索引 n 2 乘以 1 添加索引 eq
  并且 { pop pop /nn 1 sub def } 如果
}定义
/多边形{
  NArray n 2 eq { 0 0 /n 3 def } if
  n 3 升
    { n { 啪啪 } 重复 }
    { n 3 gt { CheckClosed } 如果
      n 2 乘 -2 滚
      /y0 ED /x0 ED /y1 ED /x1 ED  
      x1 y1
      /x1 x0 x1 添加 2 div def
      /y1 y0 y1 添加 2 div def
      x1 y1 移动到
      /nn 2 子防御
      n { 行到 } 重复
      x1 y1 x0 y0 6 4 滚动 Lineto
      Lineto pop pop closepath } 如果否则
}定义
/SymbolPolygon { % 在堆栈上 [ xyxy ...
  counttomark % 元素数量
  2 添加 /m ED
  2 复制 m 2 卷 % 复制最后两个
  m 2 div cvi /n ED % n 对
  /YA ED /XA ED % 起点
  n 1 子 {
    /YB ED /XB ED
    /XLength XB XA 子定义
    /YLength YB YA 子防御
    /PAngle YLength XLength Atan def
    /XYLength XLength YLength Pyth def
    /nSym XYLength SymStep Div cvi def
    /Shift 符号字符串宽度 pop 2 Div def
    /deltaX XLength nSym Div def
    /deltaY YLength nSym Div def
    XA Shift 子菜单 YA Shift 子菜单移至
    nSym {
      gsave rotateSymbol { PAngle 180 子 CorrAngle 子旋转 } 如果
      符号显示
      格雷斯托
      deltaX deltaY 移动
    } 重复
% XB Shift sub YB Shift sub moveto 符号显示
    /YA YB 防御 /XA XB 防御
  } 重复
  pop %删除标记符号
}定义
/钻石 {
  /mtrx CM def
  旋转
  /小时
  /星期三
  重复 0 eq { pop } { CLW mul neg
    /天 ED
    /awh Atan def
    /hda sin Div h 添加 def
    /wda cos Div w 添加 def } 如果否则
  标记 w 2 div h 2 div w 0 0 h 负 w neg 0 0 hw 2 div h 2 div
  /ArrowA { 移动到 } def
  /ArrowB { } def
  假线
  closepath mtrx 设置矩阵 } def
/三角形 {
  /mtrx CM def
  翻译
  旋转/h ED 2 div/w ED
  重复 CLW 乘以 /d ED
  /hhdwh Atan sin Div sub def
  /wwdhw Atan 2 div dup cos exch sin Div mul sub def
  标记
  0 dw neg d 0 hwd 0 d
  /ArrowA { 移动到 } def
  /ArrowB { } def
  错误的
  线
  近路径
  麥克
% DG/SR 修改开始 - 1998 年 6 月 1 日 - 补丁 3(来自 Michael Vulis)
% 设置矩阵 } def
  设置矩阵弹出
}定义
% DG/SR 修改结束
/CCA{
  /y ED /x ED
  2 复制 y sub /dy1 ED
  x sub/dx1 ED
  /l1 dx1 dy1 Pyth def
}定义
/抄送{
  /l0 l1 防御
  /x1 x dx 子防御
  /y1 y dy sub def
  /dx0 dx1 防御
  /dy0 dy1 防御
  碳评估委员会
  /dx dx0 l1 c exp mul dx1 l0 c exp mul add def
  /dy dy0 l1 c exp mul dy1 l0 c exp mul add def
  /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos abs b exp a mul dx dy Pyth Div 2 div def
  /x2 x l0 dx mul m mul sub def
  /y2 y l0 dy mul m mul sub def
  /dx l1 dx mul m mul neg def
  /dy l1 dy mul m mul neg def
}定义
/我知道了 {
  /cc 1 添加防御
  c 0 lt { /c 0 def } { c 3 gt { /c 3 def } 如果 } 如果否则
  /aa 2 mul 3 div 45 cos b exp div def
  碳评估委员会
  /dx 0 防御
  /dy 0 防御
}定义
/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 滚动 xy 曲线到 } def
/NC { CC x1 y1 x2 y2 xy 曲线到 } def
/EOC { x dx sub y dy sub 4 2 滚动 ArrowB 2 复制曲线到 } def
/BAC { IC CC xy 移动到 CC x1 y1 CP ArrowA } def
/NAC { x2 y2 xy 曲线到 CC x1 y1 } def
/EAC { x2 y2 xy ArrowB curveto pop pop } def
/OpenCurve {
  NArray n 3 lt
    { n { 啪啪 } 重复 }
    { BOC /nn 3 sub def n { NC } 重复 EOC } 如果否则
}定义
/曲线路径 {
  flattenpath /z 0 def /z0 0 def
  { /y1 ED /x1 ED /y2 y1 def /x2 x1 def
    x1 Shift 子 y1 Shift 子 移至
    保存
    startAngle 旋转 符号显示
    grestore /z0 z def }
  { /y ED /x ED PathLength@ z z0 sub SymStep ge {
      x Shift 子键 y Shift 子键移至
      保存
      rotateSymbol { y yOld sub x xOld sub Atan 180 sub CorrAngle sub rotate } if
      符号显示
      grestore /z0 z def } if
    /yOld y def /xOld x def }
  {}
  { /y y2 def /x x2 def 路径长度@
    x Shift 子键 y Shift 子键移至
    保存
    rotateSymbol { y yOld sub x xOld sub Atan 180 sub CorrAngle sub rotate } if
    符号显示
    格雷斯托
  }
  路径遍历
}定义
/打开符号曲线 {
  开放曲线
  0.1 固定平整
  /Shift 符号 stringwidth pop 2 div def
  曲线路径
}定义
/AltCurve {
  { false NArray n 2 mul 2 roll
    [ n 2 mul 3 sub 1 roll ] aload
    /积分 ED
    n 2 乘以 -2 滚 }
  { false NArray } 如果否则
  n 4 lt { n { pop pop } 重复 } { BAC /nn 4 sub def n { NAC } 重复 EAC } 如果否则
}定义
/AltOpenSymbolCurve {
  曲线
  0.1 固定平整
  /Shift 符号 stringwidth pop 2 div def
  曲线路径
}定义


% ----------- 其余代码为简单起见被删减 ------------------

第二种方法

第二种方法可以生成更紧凑的 EPS,如下所示:

%!PS-Adobe-3.0 EPSF-3.0
% 由 xpdf/pdftops 3.02pl4 制作
%%创建者:TeX
%%语言级别:2
%%DocumentSuppliedResources:(结束)
%%边界框:0 0 99 102
%%高分辨率边界框: 0 0 98.118 101.232
%%结束评论
%%开始序言
%%BeginResource: procset xpdf 3.02pl4 0
%%版权所有:版权所有 1996-2007 Glyph & Cog, LLC
/xpdf 75 字典 def xpdf 开始
% PDF 特殊状态
/pdfDictSize 15 def
/pdf设置{
  3 1 滚动 2 阵列存储
  /setpagedevice 其中 {
    弹出 3 个字典开始
      /PageSize exch def
      /ImagingBBox 空值
      /Policies 1 dict dup begin /PageSize 3 def end def
      { /Duplex true def } 如果
    currentdict 结束设置页面设​​备
  } {
    啪啪
  } 如果别的
}定义
/pdf开始页 {
  pdfDictSize 字典开始
  /pdfFillCS [] def
  /pdfFillXform {} def
  /pdfStrokeCS [] def
  /pdfStrokeXform {} def
  /pdfFill [0] def
  /pdfStroke [0] def
  /pdfFillOP false def
  /pdfStrokeOP false def
  /pdfLastFill false def
  /pdfLastStroke false def
  /pdfTextMat [1 0 0 1 0 0] def
  /pdfFontSize 0 def
  /pdfCharSpacing 0 def
  /pdfTextRender 0 def
  /pdfTextRise 0 def
  /pdfWordSpacing 0 def
  /pdfHorizScaling 1 def
  /pdfTextClipPath [] def
}定义
/pdfEndPage { 结束 } def
% PDF 颜色状态
/cs { /pdfFillXform exch def dup /pdfFillCS exch def
      设置颜色空间 } def
/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def
      设置颜色空间 } def
/sc { pdfLastFill 不 { pdfFillCS setcolorspace } 如果
      dup /pdfFill exch def aload pop pdfFillXform setcolor
     /pdfLastFill tr​​ue def /pdfLastStroke false def } def
/SC { pdfLastStroke 不 { pdfStrokeCS setcolorspace } 如果
      dup /pdfStroke exch def aload pop pdfStrokeXform setcolor
     /pdfLastStroke true def /pdfLastFill false def } def
/op { /pdfFillOP exch def
      pdfLastFill { pdfFillOP setoverprint } 如果 } def
/OP { /pdfStrokeOP exch def
      pdfLastStroke { pdfStrokeOP setoverprint } 如果 } def
/fCol {
  pdfLastFill 不 {
    pdfFillCS 设置颜色空间
    pdfFill aload pop pdfFillXform setcolor
    pdfFillOP 设置套印
    /pdfLastFill tr​​ue def /pdfLastStroke false def
  } 如果
}定义
/sCol {
  pdfLastStroke 不 {
    pdfStrokeCS 设置颜色空间
    pdfStroke aload pop pdfStrokeXform 设置颜色
    pdfStrokeOP 设置套印
    /pdfLastStroke true def /pdfLastFill false def
  } 如果
}定义
% 建立字体
/pdfMakeFont {
  4 3 滚动 findfont
  4 2 滚动矩阵缩放 makefont
  重复长度字典开始
    { 1 索引 /FID ne { def } { pop pop } ifelse } forall
    /编码 exch def
    当前词典
  结尾
  定义字体弹出
}定义
/pdfMakeFont16 {
  交换查找字体
  重复长度字典开始
    { 1 索引 /FID ne { def } { pop pop } ifelse } forall
    /WMode 交换 def
    当前词典
  结尾
  定义字体弹出
}定义
% 图形状态操作符
/q { gsave pdfDictSize 字典开始 } def
/问:
  结束 grestore
  /pdfLastFill 其中 {
    流行音乐
    pdf最后填充 {
      pdfFillOP 设置套印
    } {
      pdfStrokeOP 设置套印
    } 如果别的
  } 如果
}定义
/cm { 连接 } def
/d { 设定冲刺 } def
/i { 扁平化 } def
/j { 设置线连接 } def
/J { setlinecap } def
/M { setmiterlimit } def
/w { 设置线宽 } def
% 路径段运算符
/m { 移动到 } def
/l { lineto } def
/c { 曲线到 } def
/re { 4 2 滚动移动到 1 索引 0 rlineto 0 exch rlineto
      neg 0 rlineto closepath } def
/h { 关闭路径 } def
% 路径绘制运算符
/S { sCol 描边 } def
/Sf { fCol 描边 } def
/f { fCol 填充 } def
/f* { fCol eofill } def
% 裁剪操作符
/W { 剪辑新路径 } def
/W* { eoclip newpath } def
/Ws { strokepath clip newpath } def
% 文本状态操作符
/Tc { /pdfCharSpacing exch def } def
/Tf { 重复 /pdfFontSize 交换 def
      dup pdfHorizScaling mul exch 矩阵比例
      pdfTextMat 矩阵 concatmatrix dup 4 0 put dup 5 0 put
      exch findfont exch makefont setfont } def
/Tr { /pdfTextRender exch def } def
/Ts { /pdfTextRise exch def } def
/Tw { /pdfWordSpacing exch def } def
/Tz { /pdfHorizScaling exch def } def
% 文本定位运算符
/Td { pdfTextMat 变换移动到 } def
/Tm { /pdfTextMat exch def } def
% 文本字符串运算符
/cshow 其中 {
  流行音乐
  /cshow2 {
    重复 {
      啪啪
      1 字符串重复 0 3 索引放置 3 索引执行
    } 交换 cshow
    啪啪
  }定义
}{
  /cshow2 {
    currentfont /FontType 获取 0 eq {
      0 2 2 索引长度 1 子{
        2 复制 获取 交换 1 添加 2 索引 交换 获取
        2 复制 交换 256 乘以 添加
        2 字符串 重复 0 6 5 掷 放 重复 1 5 4 掷 放
        3 索引执行
      } 为了
    } {
      重复 {
        1 字符串重复 0 3 索引放置 3 索引执行
      } 对全部
    } 如果别的
    啪啪
  }定义
} 如果别的
/awcp {
  交换 {
    错误的字符路径
    5 索引 5 索引 rmoveto
    6 索引 eq { 7 索引 7 索引 rmoveto } if
  } 交换 cshow2
  6 {pop} 重复
}定义
/Tj {
  1 索引 stringwidth pdfTextMat idtransform pop
  sub 1 索引长度 dup 0 ne { div } { pop pop 0 } ifelse
  pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
  4 3 滚动 pdfCharSpacing pdfHorizScaling 乘以加 0
  pdfTextMat dtransform
  6 5 卷 Tj1
}定义
/Tj16 {
  2 索引字符串宽度pdfTextMat idtransform pop
  交易所分部
  pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
  4 3 滚动 pdfCharSpacing pdfHorizScaling 乘以加 0
  pdfTextMat dtransform
  6 5 卷 Tj1
}定义
/Tj16V {
  2 索引 stringwidth pdfTextMat idtransform exch pop
  交易所分部
  0 pdfWordSpacing pdfTextMat dtransform 32
  4 3 滚动 pdfCharSpacing 添加 0 交换
  pdfTextMat dtransform
  6 5 卷 Tj1
}定义
/Tj1 {
  0 pdfTextRise pdfTextMat dtransform rmoveto
  currentpoint 8 2 卷
  pdfTextRender 1 和 0 eq {
    6 复制宽度显示
  } 如果
  pdfTextRender 3 和 dup 1 eq exch 2 eq 或 {
    7 索引 7 索引 移至
    6 份
    currentfont /FontType 获取 3 eq { fCol } { sCol } ifelse
    false awcp 当前点 描边 moveto
  } 如果
  pdfTextRender 4 和 0 ne {
    8 6 滚动移动
    假 awcp
    /pdfTextClipPath [ pdfTextClipPath 加载弹出
      {/移动到 cvx}
      {/lineto cvx}
      {/曲线至 cvx}
      {/关闭路径 cvx}
    pathforall ] def
    当前点 新路径 移动到
  } {
    8 {pop} 重复
  } 如果别的
  0 pdfTextRise neg pdfTextMat dtransform rmoveto
}定义
/TJm { pdfFontSize 0.001 乘以 负 0
       pdfTextMat dtransform rmoveto } def
/TJmV { pdfFontSize 0.001 mul mul neg 0 exch
        pdfTextMat dtransform rmoveto } def
/Tclip { pdfTextClipPath cvx exec clip newpath
         /pdfTextClipPath [] def } def
% 2级图像算子
/pdfImBuf 100 字符串 def
/pdfIm {
  图像
  { 当前文件 pdfImBuf readline
    不 { 弹出退出 } 如果
    (%-EOD-)eq {退出} if}循环
}定义
/pdfImM {
  fCol 图像蒙版
  { 当前文件 pdfImBuf readline
    不 { 弹出退出 } 如果
    (%-EOD-)eq {退出} if}循环
}定义
/pr { 2 索引 2 索引 3 2 滚动 putinterval 4 添加 } def
/pdfImClip {
  保存
  0 2 4 索引长度 1 sub {
    重复 4 索引 交换 2 副本
    获取 5 索引 div 放入
    1 添加 3 索引 交换 2 复制
    获取 3 索引 div 放入
  } 为了
  弹出弹出矩形夹
}定义
/pdfImClipEnd { grestore } def


% ----------- 其余代码为简单起见被删减 ------------------

问题

我认为第一种方法中的 EPS 包含不必要的 PSTricks 代码,即 PSTricks 词典和库代码。如何删除它们?

答案1

跑步:

dvips <file>
gs -q -dNOPAUSE -dBATCH -sDEVICE=epswrite -sOutputFile=<file>.eps  -f <file>.ps

相关内容