人们使用什么程序将他们的标签放在准备好被 psfrag 替换的位置?我尝试过 inkscape,但如果我在文本中写上“hello”,然后使用 inkscape 将其导出为 eps,PSfrag 似乎无法替换我添加的标签(尽管它确实替换了我在 Mathematica 中放置的标签)。
是否有更好的图形程序可以进行这种标记?
答案1
Psfrag 依赖于放置的文本非常简单,特别是,如果您想替换,hello
则hello
需要将其作为单个字符串放置在 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
目标(黑色、黄色等)。删除这些线条很烦人,但这样可以确保不会忘记任何标签。