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

and*_*ras 6 gnuplot

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

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

使用错误的单位输出看起来相同(在一些边际误差内).这是巧合吗?这里发生了什么?

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

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

mgi*_*son 3

由于两个图位于同一单位制中,这种行为是预期的——尽管可能没有很好/准确地记录。(从help post

In `eps` mode the whole plot, including the fonts, is reduced to half of 
the default size.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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)
Run Code Online (Sandbox Code Playgroud)

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

编辑

进一步挖掘后,开罗图书馆似乎采取了一些自由行动并嵌入了您没有要求的(类似)字体。

运行pdffonts myfile.pdf- 请注意,您只需通过以下方式即可获取字体名称strings myfile.pdf | grep FontName

name                 type         emb sub uni object ID
-------------------- ------------ --- --- --- ------ --
LiberationSansBold   CID TrueType yes no  yes      5 0
Run Code Online (Sandbox Code Playgroud)

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