![如何删除 dvips 生成的 EPS 文件中的 PSTricks 字典或库代码?](https://linux22.com/image/238426/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%20dvips%20%E7%94%9F%E6%88%90%E7%9A%84%20EPS%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%20PSTricks%20%E5%AD%97%E5%85%B8%E6%88%96%E5%BA%93%E4%BB%A3%E7%A0%81%EF%BC%9F.png)
我有两种互斥的方法来生成 EPS 格式的裁剪 PSTricks 图形:
- 使用
latex input.tex
后跟dvips input.dvi -E -o output.eps
。 - 或者使用
latex input.tex
后跟dvips input.dvi
后跟ps2pdf input.ps
后跟pdfcrop --hires input.pdf
。pdftops -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 true 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 true 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