如何在 gnuplot 的 eps 和 pdf 终端中实现输出的一致性?

How do I achieve consistency in output in eps and pdf terminals in gnuplot?

我试图在 gnuplot 中的 eps 和 pdf 终端之间获得一些一致的输出。问题是他们似乎对尺寸单位的理解不同。以英寸为单位的相同指定大小将导致 pdf 输出的字体大小更大:

1
2
3
4
5
6
7
8
set terminal postscript eps enhanced colour size 10in,8in font 'Arial-Bold,14'
set output 'my_eps.eps'
set title 'My plot'
plot sin(x) notitle

set terminal pdfcairo size 10in,8in font 'Arial-Bold,14'
set output 'my_pdf.pdf'
replot

.pdf 中的文本要大得多,而且图表很狭窄。但是,如果我将 eps 的大小单位更改为 cm:

1
2
3
4
5
6
7
8
9
set terminal postscript eps enhanced colour size 10cm,8cm font 'Arial-Bold,14'
                                                 ########
set output 'my_eps.eps'
set title 'My plot'
plot sin(x) notitle

set terminal pdfcairo size 10in,8in font 'Arial-Bold,14'
set output 'my_pdf.pdf'
replot

使用错误的单位,输出看起来相同(在一些边距误差范围内)。这是巧合吗?这是怎么回事?

这是针对 Gnuplot 4.4(补丁级别 3)Ubuntu 11.10 测试的。

(我知道我可以使用一些实用程序在 eps 和 pdf 之间进行转换,因此它们是相同的,但我想了解 gnuplot 中发生了什么。)


由于两个plot在同一个单位系统中,这种行为是预期的——尽管可能没有很好/准确地记录。 (来自 help post)

1
2
In `eps` mode the whole plot, including the fonts, is reduced to half of
the default size.

由于您明确指定了大小,因此该部分保持不变,但即使您明确指定了字体,字体在 eps 图上的大小仍会缩小 2 倍(我不知道这是为什么,但一直都是这样——我一直认为它至少是文档中的一个错误......)。

至于将单位切换为厘米——我不在我的计算机上启用了 cairo 终端,所以我现在无法检查......但这似乎很奇怪(对我来说)。是不是因为从英寸到厘米的转换大约是 2 倍,这使得它们看起来如此相似? (例如,你的字体是一半大小,而你的情节是大小的 1/2.54)

为了实现终端独立,我想你可以把它写在一个函数中(当前未测试):

1
2
3
4
5
6
7
8
9
10
11
fontsize(x)=((GPVAL_TERM eq 'postscript') && \\
             (strstrt(GPVAL_TERMOPTIONS,"eps")!=0)) ? x*2 : x
set term post eps enh size 10in,8in
set termoption font"Arial,".fontsize(7)
set output"Hello.eps"
plot sin(x)

set term pdfcairo enh size 10in,8in
set termoption font"Arial,".fontsize(7)
set output"Hello.pdf"
plot sin(x)

确保只将整数传递给 fontsize -- 在进行字符串连接时,整数会被提升为字符串。

编辑

在深入挖掘之后,cairo 库似乎采取了一些自由并嵌入了您没有要求的(类似)字体。

running pdffonts myfile.pdf -- 请注意,您仅通过 strings myfile.pdf | grep FontName 获得字体名称:

1
2
3
name                 type         emb sub uni object ID
-------------------- ------------ --- --- --- ------ --
LiberationSansBold   CID TrueType yes no  yes      5 0

而后记仅包含字体名称(未嵌入),它被 ps 查看器翻译为它可以找到的最接近请求字体的东西(它 [可能] 替换了您也没有要求的字体) .因此,要实现真正的终端独立性(在这两个终端之间),您需要找到嵌入在 pdf 中的字体文件,然后 set postscript eps enh color fontfile add"<fontfile>" 以在 pdf 和 postscript 中嵌入相同的字体文件。


使用 Ghostscript 实现 100% 的一致性

我使用 Ghostscript 将 gnuplot 创建的 Encapsulated PostScript (EPS) 图转换为 PDF。效果很好!

1
gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=output.pdf input.eps