PSFrag 标记

PSFrag 标记

人们使用什么程序将他们的标签放在准备好被 psfrag 替换的位置?我尝试过 inkscape,但如果我在文本中写上“hello”,然后使用 inkscape 将其导出为 eps,PSfrag 似乎无法替换我添加的标签(尽管它确实替换了我在 Mathematica 中放置的标签)。

是否有更好的图形程序可以进行这种标记?

答案1

Psfrag 依赖于放置的文本非常简单,特别是,如果您想替换,hellohello需要将其作为单个字符串放置在 PostScript 文件中(即,最有可能(hello)包含括号的字符串出现在 EPS 文件中)。如果应用程序旨在进行任何排版改进,而不是将单词设置为简单的 PostScript 字符串,而是放置每个字母并进行微调字距调整,那么 psfrag 将找不到文本。

因此,如果您在制作 eps 时知道要使用 psfrag,有时最好限制为单字母标签,h而不是,hello因为它们最有可能不被干扰。或者,如果已经制作了 EPS,请在文本编辑器中查看文件并搜索文本字符串(如果使用了压缩过滤器,则不可能),例如hello可以设置为(he) 一些后记 (ll) 一些后记 (o)在这种情况下,您需要在 psfrag 中使用这些字符串,映射he到替换文本,而将另外两个字符串映射到无。

更新似乎较新版本的 inkscape 确实使 EPS 输出对于 psfrag 来说过于复杂,此处详细介绍了一种解决方法(我尚未确认)http://tavmjong.free.fr/INKSCAPE/MANUAL/html/File-Export.html意思是

从 v0.47 开始,此方法将失败,因为基于 Cairo 的导出使用字体子集(仅存储实际使用的字符,然后使用索引引用这些字符)来节省空间,因此无法找到您的字符串。一种解决方法是在 PostScript 文件中搜索格式为 <01020304>Tj 或 [<010203>-1<0405>-1<06>-1<07>1<08>129<090a06>]TJ 的字符串,然后将其替换为格式为 (Export Test)Tj 的字符串。最好只使用以前的方法,即使用 LaTeX 覆盖保存 PDF、PostScript 或 EPS 文件

答案2

回答开始的问题(人们使用什么程序来放置他们的标签以便被 psfrag 替换?):我使用 CorelDRAW 制作几乎所有的 EPS 图形。一定要选中(在导出对话框中)Export Text as Text,但您可以安全地取消选中Include font以节省一些空间并保持 EPS 文件整洁。

为了解决 David Carlisle 提到的“排版改进”问题,我使用了等宽字体Courier New。到目前为止,这种方法对很多图形都有效。也许您也可以在 Inkscape 中尝试这个“技巧”。

稍微有点 OT,但这里有一小段代码,我用它来从我的图中获取所有标签:

perl -e 'my %str; while (<>) { $_ =~ /\(.+\)/ or next; chomp($_); $_ =~ s/.*\((.+)\).*/\1/; if (not $_ =~ / /) { $str{$_} = "$_"; }}; my @sstr = sort { lc($a) cmp lc($b) } keys %str; foreach(@sstr) {print "\\psfrag\{$_\}\{$str{$_}\}\n"; }' < figure.eps

它会跳过所有包含空格的有效psfrag目标(无论如何,这将是一个坏标签),以摆脱 EPS 中包含的一些描述。您将获得所有目标字符串的排序列表,可供复制和粘贴:

\psfrag{_Aschicht}{_Aschicht}
\psfrag{_Bschicht}{_Bschicht}
\psfrag{_oktaeder}{_oktaeder}
...

但是,如果使用 CorelDRAW,仍然会有一些不需要的psfrag目标(黑色、黄色等)。删除这些线条很烦人,但这样可以确保不会忘记任何标签。

相关内容