在R图形中使用Unicode'dingbat-like'字形,跨设备&平台,尤其是PDF

时间:2011-05-04 15:37:05

标签: r pdf graphics unicode

你们中的一些人可能已经看过我关于这个主题的blog post,在我想要帮助一位朋友在图表上生成半满的圆圈之后我写了下面的代码:

TestUnicode <- function(start="25a0", end="25ff", ...)
  {
    nstart <- as.hexmode(start)
    nend <- as.hexmode(end)
    r <- nstart:nend
    s <- ceiling(sqrt(length(r)))
    par(pty="s")
    plot(c(-1,(s)), c(-1,(s)), type="n", xlab="", ylab="",
         xaxs="i", yaxs="i")
    grid(s+1, s+1, lty=1)
    for(i in seq(r)) {
      try(points(i%%s, i%/%s, pch=-1*r[i],...))
    }
  }

TestUnicode(9500,9900) 

这是有效的(即产生一个几乎完整的冷的dingbatty符号网格):

  • 在Ubuntu 10.04上,在X11或PNG设备中
  • 在Mandriva Linux发行版上,相同的设备,本地构建的R,一旦安装了pango-devel

无论是静音还是警告,它都不会有不同程度(即产生部分或完全填充点或空矩形的网格):

  • 在PDF或PostScript的同一台Ubuntu 10.04机器上(尝试设置font =“NimbusSan”使用URW字体,没有帮助)
  • on MacOS X.6(quartz,X11,Cairo,PDF)

例如,尝试所有可用的PDF字体系列:

flist <- c("AvantGarde", "Bookman","Courier", "Helvetica", "Helvetica-Narrow",
        "NewCenturySchoolbook", "Palatino", "Times","URWGothic",
        "URWBookman", "NimbusMon", "NimbusSan", "NimbusSanCond",
        "CenturySch", "URWPalladio","NimbusRom")

for (f in flist) {
  fn <- paste("utest_",f,".pdf",sep="")
  pdf(fn,family=f)
  TestUnicode()
  title(main=f)
  dev.off()
  embedFonts(fn)
}

在Ubuntu上,这些文件都不包含符号。

让它在尽可能多的组合上工作会很好,但特别是在某种矢量格式和双倍 - 特别是在PDF中。

任何有关使这项工作的字体/图形设备配置的建议都会受到欢迎。

4 个答案:

答案 0 :(得分:13)

我认为你运气不好Ben,因为根据Paul Murrell的一些注释,pdf()只能处理单字节编码。需要将多字节编码转换为单字节等效编码,其中存在摩擦;根据定义,单字节编码不能包含所有可以用UTF-8等多字节编码表示的字形,比如说。

保罗的笔记可以找到here,其中他建议使用基于开罗的PDF设备的几个解决方案,在适当赋予的Linux和Mac OS系统上使用cairo_pdf(),或通过{{1} MS Windows下的软件包。

答案 1 :(得分:6)

我发现cairo_pdf设备完全不足:输出明显不同于pdf和屏幕渲染,其plotmath支持是粗略的。

但是,OS X上有一个相当简单的解决方法:使用“普通”quartz设备并将其type设置为pdf

quartz(type = 'pdf', file = 'output.pdf')

不幸的是,在我的计算机上,这会忽略字体系列并始终使用Helvetica(尽管文档声称默认为Arial)。

至少有两个其他问题:

  • pdf converts hyphens to minuses。这可能不一定总是你想要的,但正确排版负数非常有用。链接的线程描述了此方法。
  • 它当然是特定于平台的,仅适用于OS X.

(我意识到OP简要提到了Quartz设备,但经常会看到这个线程,我觉得这个解决方案需要更加突出。)

答案 2 :(得分:3)

另一种解决方案可能是使用tikzDevice,现在可以将XeLaTeX与Unicode字符一起使用。然后可以编译生成的tex文件以生成pdf。问题仍然是您的系统上必须包含包含字符的字体。

library(tikzDevice)
options(tikzXelatexPackages=c(getOption('tikzXelatexPackages'),
    '\\setromanfont{Courier New}'))
tikz(engine='xetex',standAlone=T)
TestUnicode(9500,9900)
dev.off()

第一次,这需要很长时间。

答案 3 :(得分:0)

您是否尝试在PDF中嵌入字体,或者为Mac用户提供一个可以使用的字体?