如何为R包创建一个特定的字体族?

5
我需要使用客户自己授权的字体来呈现带有图表的包裹。这些图表必须以EPS格式呈现并发送给报告的布局人员。
我拥有.ttf格式的字体文件,文件名如下:
- FontNameSans-Bold.ttf - FontNameSans-Medium.ttf - FontNameSerif-Bold.ttf - FontNameSerif-Regular.ttf ...
我还拥有这些文件的.eot、.svg和.woff版本。
因此,我尝试了extrafont包:
ttf_import('Path/To/ttfFiles')
fonts()
[1] "FontNameSans-Bold"     "FontNameSans-Light"   
[3] "FontNameSans-Medium"   "FontNameSans-Regular" 
[5] "FontNameSerif-Bold"    "FontNameSerif-Light"  
[7] "FontNameSerif-Medium"  "FontNameSerif-Regular"

我原本期望看到两个家庭,但显然这行不通。

最终,ttf文件应该包含在inst文件夹的子文件夹中,我应该有以下类似的东西:

.onLoad({
  font_import(file.path(system.file(package = 'mypackage'),
                        "fontdir")
  )
  # something else to create a family FontName for 
  # use with postscript() or cairo_ps()
  loadfonts()
})

所以我随后可以执行以下操作:
setEPS()
postscript('somefile.eps', family = 'FontName Sans')
plot(mydata)
dev.off()
embed_fonts('somefile.eps', outfile = 'somefile-embedded.eps')

问题:我需要采取哪些额外步骤才能使字体族像其他字体族一样可用?

编辑:我知道在使用字体之前必须加载它们。但是如果注册错误,我就无法加载字体族。问题是如何正确地注册字体族,以便其余部分正常工作。


1
你需要使用 extrafont::loadfonts 实际加载字体(导入只是将它们放置于字体数据库中)。你也可以在 loadfonts 中指定要加载的设备(默认为 pdf)。你可以多次调用 loadfonts 来为多个设备加载字体。 - hrbrmstr
@hrbrmstr 显然,但这不是问题所在。如果它们没有正确注册,加载字体是没有意义的。有什么想法? - Joris Meys
1个回答

1
这个答案有点晚了,也许你不再需要了。但这可能对搜索中的其他用户有帮助。
根据您的操作系统,您需要执行不同的步骤。我有一个包,其中包括inst/extdata/fonts/some-fonts.ttf中的几种字体。
  • 在Linux系统上,可以在加载包时将这些文件复制到fonts目录中。
  • 在Windows上,需要手动将.ttf文件复制到C:/Windows/Fonts
为了在加载包时加载字体,我修改了.onLoad函数:
.onLoad <- function(libname, pkgname) {
  if (Sys.info()[1] == "Linux") {
    dir.create('~/.fonts')
    file.copy("inst/extdata/fonts/some-fonts.ttf", "~/.fonts")
    system('fc-cache -f ~/.fonts')
  }
  if (Sys.info()[1] == "Windows") {
    windowsFonts()
    extrafont::font_import(pattern = "some-fonts", prompt = FALSE)
    extrafont::loadfonts(device = "win")
    windowsFonts()
  }
  print(extrafont::fonts())
}
  • 在Linux上,我只需要将自定义字体放在字体目录中即可。随后它们就可以在R中使用。
  • 在Windows上,您需要使用extrafont::font_import导入它们,并使用extrafont::loadfonts(device = "win")注册它们。

希望这可以帮助您、他人或我的未来自己。;-)


你好,感谢您提供的解决方案。但是对我来说并没有起作用。然而,如果我尝试使用load_all()加载我的包,我会得到这个神秘的错误信息:error in nsenv[[f_name]](dirname(ns_path), package) : unused argument (dirname(ns_path), package) - JBJ
非常感谢您的回答@symbolrush。您有一个适用于MacOS((Sys.info()[1] ==“达尔文”)的建议吗?我是否也需要复制字体文件?谢谢!!! - trangdata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接