R代表Windows的TTF / OTF字体选择:屏幕与pdf()

时间:2012-09-11 22:05:53

标签: windows r unicode fonts

我知道在Linux或Mac上的R中,字体一直被定义为参数family =“Charis SIL”到par(),text()或其中一个图形设备函数,如tiff(),svg()等等(用你想要的任何字体名称替换“Charis SIL”)。我也知道在Windows上,它只适用于cairo_pdf()和svg()设备;像jpeg(),tiff(),png()和bmp()之类的光栅图形设备要求首先在“Windows字体数据库”中映射字体:

# this doesn't work on windows
jpeg(filename='test1.jpg', family='Charis SIL')
plot(0,0,type='n',ann=FALSE,frame.plot=FALSE)
text(0,0,labels='iyeøɛœaɶɪʏæɑɒʌɔɤoɯuʊɨʉɘɵəɜɞɐɚɝ')
dev.off()
# (gives warnings: Font family not found in Windows font database)  

# this does work on windows (assuming you have the Charis SIL font installed)
windowsFonts(myCustomWindowsFontName=windowsFont('Charis SIL'))
jpeg(filename='test2.jpg', family='myCustomWindowsFontName')
plot(0,0,type='n',ann=FALSE,frame.plot=FALSE)
text(0,0,labels='iyeøɛœaɶɪʏæɑɒʌɔɤoɯuʊɨʉɘɵəɜɞɐɚɝ')
dev.off()

pdf()设备仍然不同:它似乎需要在postscriptFonts()和/或pdfFonts()数据库中定义的字体,这意味着只有Type1字体:

# this doesn't work on windows
pdf('test.pdf', family='Charis SIL')
# gives error: Unknown family "Charis SIL"

# this doesn't work either
windowsFonts(myCustomWindowsFontName=windowsFont('Charis SIL'))
pdf('test.pdf', family='myCustomWindowsFontName')
# gives error: Unknown family "myCustomWindowsFontName"

# this also won't work
pdf.options(family='Charis SIL')
pdf('test.pdf')
# gives error: Invalid font type
# also gives warning: font family "Charis SIL" not found in Postscript font database

通常这没关系,因为cairo_pdf()是pdf()设备的一个很好的替代品,可以很好地处理TTF和OTF字体。问题是,如果用户绘制到屏幕设备,然后使用菜单命令保存为PDF,它似乎调用pdf()而不是cairo_pdf(),然后抛出错误:

# this part works
windowsFonts(myCustomWindowsFontName=windowsFont('Charis SIL'))
par(family='myCustomWindowsFontName')
plot(0,0,type='n',ann=FALSE,frame.plot=FALSE)
text(0,0,labels='iyeøɛœaɶɪʏæɑɒʌɔɤoɯuʊɨʉɘɵəɜɞɐɚɝ')

# but menu command "File > Save As > PDF" gives errors:
# Error: Invalid font type
# Warning: font family "Charis SIL" not found in Postscript font database

这是一个问题,因为我正在开发的R软件包在Windows上无法“R CMD检查”,显然是因为示例代码生成的屏幕输出会自动保存为PDF,这会产生上述错误。一种解决方案是放弃Windows中屏幕设备的自定义字体(即,如果所选输出是“屏幕”,则忽略“家庭”参数)。另一个选择是使用Cairo()包进行屏幕绘图,但如果可以,我更愿意坚持使用基本图形。我有什么方法可以在屏幕上绘制自定义字体而不会在使用“另存为PDF”菜单命令时抛出错误?

1 个答案:

答案 0 :(得分:1)

我最终解决这个问题的方式如下:

oldSans <- windowsFonts()$sans
windowsFonts(sans=windowsFont('Charis SIL'))
par(family='sans') # this line isn't necessary anymore
plot(0,0,type='n',ann=FALSE,frame.plot=FALSE)
text(0,0,labels='iyeøɛœaɶɪʏæɑɒʌɔɤoɯuʊɨʉɘɵəɜɞɐɚɝ')
windowsFonts(sans=oldSans)

这样,屏幕窗口中将使用正确的字体,当用户使用菜单命令保存为PDF时,PDF将被保存,但使用默认的sans字体而不是自定义字体。它只是在PDF导出的意义上的“解决方案”,但如果绘图具有非ASCII字形,则无法保证它们将以这种方式显示在PDF中。它也可以说比原始情况更糟糕,因为行动不再抛出error甚至warning。故事的寓意:不要依赖GUI中的菜单命令来执行您应该知道如何在控制台中执行的操作。