我怎样才能拦截使用 includegraphics 加载的文件中 postscript 指令?

我怎样才能拦截使用 includegraphics 加载的文件中 postscript 指令?

碎片包能够截取 eps 文件中的某些指令,并用新指令替换它们。这样,就可以用文档中其他地方使用的字体替换图像中的字体。我想实现更通用但更简单的功能:当包含 eps 文件时,字符串 A 将被字符串 B 替换(逐字替换)。例如,假设以下杰作要包含在文档中:

%!PS-Adobe-2.0 EPSF-2.0
%%Title: pumpkin.eps
%%BoundingBox: 0 0 200 200
/tri {newpath 0 0 moveto 10 0 lineto 0 20 lineto -10 0 lineto closepath fill} bind def
1.0 0.6 0.25 setrgbcolor
1 setlinewidth
100 100 100 0 360 arc gsave stroke grestore fill
0 0 0 setrgbcolor
100 90 60 190 350 arc stroke
100 100 translate tri
-50 40 translate tri
100 0 translate tri
showpage
%EOF

但是,作者决定线条粗细应为 2,而不是 1。也就是说,1 setlinewidth应将其替换为2 setlinewidth。如何在 LaTeX 文档中实现这一点?

我所想到的实际应用涉及加粗 Matlab 生成的某些类型的图上的框架。Matlab 本身没有选项可以执行此操作,而我目前的方法(手动编辑后记,以及在导出文件后使用系统调用 sed 来更改文件)相当笨拙。

答案1

对于 psfrag,tex 根本不访问文件(除了可选地查找注释)%%BoundingBox。它通过加载 PostScript 标头来工作,该标头重新定义(在 EPS 范围内)后记show(和相关运算符),以便它们不是简单地排版提供的字符串,而是查找字符串并显示 latex 排版的替代方案。

因此,您情况下的类似操作将是重新定义setlinewidth,以便如果其参数为 1,那么它将执行实际的 setlinewidth 2,但是在这种情况下,您可能只想调整命令的特定实例,这可能很棘手(或者不,取决于后记的可读性,查看要重新定义哪些命令,以及如何测试“正确”的实例。)

也许另一种方法是将原始 eps 放在修改后的filecontents环境中,然后将其写出并定义替换,并使用新的/修改后的名称\includegraphics

在此处输入图片描述

\documentclass{article}

\usepackage{graphicx}

\begin{document}


aaa

\includegraphics{zz.eps}

bbb

\special{ps: save  /zz {setlinewidth} bind def /setlinewidth { 10 mul zz} bind def}
\includegraphics{zz.eps}
\special{ps: restore}

ccc

\end{document}

相关内容