R中用于windows的TTF / OTF字体select:onscreen vs pdf()

我知道在Linux或Mac上的R中,字体一直定义为参数par(),text()或graphics设备函数(如tiff(),svg()等)的参数族=“Charis SIL”用你想要的字体replace“Charis SIL”)。 我也知道,在Windows上,只能用于cairo_pdf()和svg()设备; 像jpeg(),tiff(),png()和bmp()这样的光栅graphics设备要求首先将字体映射到“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中的屏幕设备的自定义字体(即,只要忽略“家庭”参数,如果select的输出是“屏幕”)。 另一个select是使用Cairo()包进行屏幕绘图,但是如果可以的话,我更愿意使用基本graphics。 有没有什么办法可以在屏幕上显示自定义字体,而不会在使用“另存为PDF”菜单命令时出现错误?

Solutions Collecting From Web of "R中用于windows的TTF / OTF字体select:onscreen vs pdf()"

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

 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中的菜单命令来执行你应该知道如何在控制台中执行的操作。