使用另一个EPS中的值更新一个EPS中的边界框的脚本

时间:2012-12-15 22:36:20

标签: regex shell latex bounding-box eps

我在LaTeX中创建了大量图像(主要是pstricks)。这些图像中的一些形成序列的一部分,显示某些算法的进展。渐进增加或删除图像中的内容,这有效地影响图像大小,从而也影响周围的边界框。

所以我想做的是有一个脚本(在任何命令行可调用语言中),它将提取一个文件的边界框组件(比如FileA.eps)并用边界框组件替换它们另一个文件(比如FileB.eps)。有时我想仅针对y - 组件执行此操作,有时仅针对x - 组件,有时仅针对单个组件(这取决于显示进度的序列)。例如,考虑使用latex - > dvips序列创建的以下两个文件:

FileA.eps

%!PS-Adobe-2.0 EPSF-2.0
%%BoundingBox: 170 378 252 452
%%HiResBoundingBox: 170.340 378.474 251.880 451.626
%%Creator: dvips(k) 5.992 Copyright 2012 Radical Eye Software
...

FileB.eps

%!PS-Adobe-2.0 EPSF-2.0
%%BoundingBox: 148 365 269 478
%%HiResBoundingBox: 148.446 365.940 268.483 477.651
%%Creator: dvips(k) 5.992 Copyright 2012 Radical Eye Software
...

我希望将FileA.eps更新为

更新了FileA.eps

%!PS-Adobe-2.0 EPSF-2.0
%%BoundingBox: 170 365 252 478
%%HiResBoundingBox: 170.340 365.940 251.880 477.651
%%Creator: dvips(k) 5.992 Copyright 2012 Radical Eye Software
...

其中y - FileB.eps坐标用于替换原始y中的FileA.eps坐标。请注意,此更改适用于%%BoundingBox%%HiResBoundingBox

理想情况下,我想要一些使用

调用的通用脚本boundingboxscript
[lang] boundinboxscript FileA.eps FileB.eps

其中[lang]是语言(如perlruby),FileA.eps就地编辑。这个讨论起源于TeX, LaTeX & Friends chat room。我正在运行Windows 7。

1 个答案:

答案 0 :(得分:2)

我对perl一无所知,但也许你可以转换这个ruby脚本:

outfile = ARGV[0]
infile = ARGV[1]
opts = ARGV[2]
unless File.read(infile) =~ /%%BoundingBox: (\d+) (\d+) (\d+) (\d+)/
  puts "Invalid input file."
  exit!
else
  x, y, w, h = $1, $2, $3, $4
  eps = File.read(outfile).sub(/%%BoundingBox: (\d+) (\d+) (\d+) (\d+)/) do
    x = $1 unless opts.include? "x"
    y = $2 unless opts.include? "y"
    w = $3 unless opts.include? "w"
    h = $4 unless opts.include? "h"
    "%%BoundingBox: #{x} #{y} #{w} #{h}"
  end
  File.write(outfile, eps)
end

调用:

ruby boundinboxscript.rb FileA.eps FileB.eps xywh

最后一个选项是您要从FileB.eps获取并放入FileA.eps的内容。