5

LinuxまたはMacのRでは、フォントは一貫して、par()、text()、またはtiff()、svg()などのグラフィックデバイス関数の1つに対する引数family = "CharisSIL"として定義されていることを知っています( 「CharisSIL」を任意のフォント名に置き換えてください)。また、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として保存すると、cairo_pdf()ではなく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で「RCMDチェック」に失敗し続けるために問題になります。これは、サンプルコードが画面上の出力を生成し、PDFとして自動的に保存されるため、上記のエラーが発生するためと思われます。1つの解決策は、Windowsの画面上のデバイスのカスタムフォントを放棄することです(つまり、選択した出力が「画面」の場合は、「ファミリ」引数を無視します)。もう1つのオプションは、画面上のプロットにCairo()パッケージを使用することですが、可能であれば、ベースグラフィックスを使用することをお勧めします。画面上のプロットでカスタムフォントを取得し、「PDFとして保存」メニューコマンドを使用したときにエラーがスローされないようにする方法はありますか?

4

1 に答える 1

2

私が最終的にこれを解決した方法は次のとおりです。

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は保存されますが、カスタムフォントではなくデフォルトのサンセリフフォントが使用されます。これは、PDFがエクスポートされるという意味でのみ「解決策」ですが、プロットに非ASCIIグリフが含まれている場合、この方法で生成されたPDFに表示される保証はありません。errorまた、アクションがまたはをスローしなくなったため、元の状況よりも間違いなく悪いですwarning。話の教訓:コンソールで行う方法を知っておくべきことを行うために、GUIのメニューコマンドに依存しないでください。

于 2012-10-02T21:43:21.233 に答える