Mengapa huruf Yunani gagal dirender dalam keluaran PDF R (v4)?

Dec 05 2020

Saya mencoba mengekspor plot sederhana ke PDF dari R, dengan huruf Yunani, seperti ini:

cairo_pdf("test.pdf")
barplot(1, main = "\u03C1")
dev.off()

Saya menggunakan sistem OpenSUSE LEAP 15.1 dengan R 3.5 yang sudah diinstal sebelumnya - ini berfungsi dengan baik. Jadi font yang diperlukan harus diinstal.

Namun, di R 4.0.3 (yang saya kompilasi sendiri), perintah yang sama menghasilkan kotak alih-alih huruf Yunani:

(Menariknya, salin dan tempel kotak ini menyisipkan huruf Yunani yang benar.)

Apakah ini perbedaan mendasar antara R v3 dan v4 (jika ya, yang mana?), Atau dapatkah saya mempengaruhinya selama kompilasi? Saya tidak memiliki masalah yang sama pada Windows, tetapi ini adalah versi rilis yang tidak saya kompilasi sendiri dan memiliki kemampuan ICU.

Melihat file PDF, file v3 menggunakan Cantarell-Regular dan SourceCodePro-Bold. Yang v4 menggunakan Cantarell-Regular dan Cantarell-Bold. Semua font disematkan subset. Jadi entah bagaimana, R v4 sepertinya gagal beralih ke SourceCodeProfont itu, meskipun sudah diinstal:

> fc-list | grep SourceCodePro
/usr/share/fonts/truetype/SourceCodePro-Medium.otf: Source Code Pro,Source Code Pro Medium:style=Medium,Regular
/usr/share/fonts/truetype/SourceCodePro-Regular.otf: Source Code Pro:style=Regular
/usr/share/fonts/truetype/SourceCodePro-Bold.otf: Source Code Pro:style=Bold
/usr/share/fonts/truetype/SourceCodePro-Black.otf: Source Code Pro,Source Code Pro Black:style=Black,Regular
/usr/share/fonts/truetype/SourceCodePro-BoldIt.otf: Source Code Pro:style=Bold Italic
/usr/share/fonts/truetype/SourceCodePro-Semibold.otf: Source Code Pro,Source Code Pro Semibold:style=Semibold,Regular
/usr/share/fonts/truetype/SourceCodePro-ExtraLightIt.otf: Source Code Pro,Source Code Pro ExtraLight:style=ExtraLight Italic,Italic
/usr/share/fonts/truetype/SourceCodePro-BlackIt.otf: Source Code Pro,Source Code Pro Black:style=Black Italic,Italic
/usr/share/fonts/truetype/SourceCodePro-LightIt.otf: Source Code Pro,Source Code Pro Light:style=Light Italic,Italic
/usr/share/fonts/truetype/SourceCodePro-MediumIt.otf: Source Code Pro,Source Code Pro Medium:style=Medium Italic,Italic
/usr/share/fonts/truetype/SourceCodePro-It.otf: Source Code Pro:style=Italic
/usr/share/fonts/truetype/SourceCodePro-SemiboldIt.otf: Source Code Pro,Source Code Pro Semibold:style=Semibold Italic,Italic
/usr/share/fonts/truetype/SourceCodePro-Light.otf: Source Code Pro,Source Code Pro Light:style=Light,Regular
/usr/share/fonts/truetype/SourceCodePro-ExtraLight.otf: Source Code Pro,Source Code Pro ExtraLight:style=ExtraLight,Regular

Di configureperintah R , begitu

Kemampuan dilewati: ICU

dimana ICU = Komponen Internasional untuk Unicode. Juga:

memeriksa apakah pkg-config tahu tentang cairo dan pango ... tidak

memeriksa apakah pkg-config tahu tentang cairo ... ya

Mungkinkah salah satu dari keduanya terkait?

Mengedit : Saya telah menemukan dan membaca Perubahan Symbol Font untuk Kairo Graphics Devices , namun

cairo_pdf("test.pdf", symbolfamily = cairoSymbolFont("Courier", usePUA = FALSE))
barplot(1, main = "\u03C1")
dev.off()

sebaik

cairo_pdf("test.pdf", symbolfamily = cairoSymbolFont("Courier", usePUA = TRUE))
barplot(1, main = "\u03C1")
dev.off()

menghasilkan keluaran yang sama seperti di atas

cairo_pdf("test.pdf", family = "Courier")
barplot(1, main = "\u03C1")
dev.off()

berhasil mengubah font standar, menunjukkan bahwa Courier diinstal dan dapat digunakan.

Jawaban

1 bers Dec 06 2020 at 03:21

Kompilasi ulang dengan dukungan ICU tidak memperbaiki masalah ini - kompilasi ulang dengan cairo dan pango berhasil .

Untuk mencapai keduanya, ada banyak paket penginstalan trial-and-error. Singkatnya, saya melakukannya zypper in libicu-devel freetype-devel freetype pango-devel pango-tools libpango-1_0-0 harfbuzz-devel fribidi-devel fribidi. Sebagian besar mungkin sudah diinstal, tetapi dalam prosesnya, saya perhatikan bahwa penginstalan libharfbuzz0dan libharfbuzz-icu0 rusak dan memperbaikinya .

Kemudian mengkonfigurasi ulang dan mengkompilasi ulang R, dan masalahnya hilang.