usando os glifos “dingbat-like” do Unicode em charts R, em dispositivos e plataformas, especialmente PDF

Alguns de vocês podem ter visto meu post sobre este tópico, onde eu escrevi o seguinte código depois de querer ajudar um amigo a produzir círculos meio cheios como pontos em um gráfico:

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) 

Isso funciona (ou seja, produz uma grade quase cheia de símbolos legais dingbatty):

  • no Ubuntu 10.04, em um dispositivo X11 ou PNG
  • na distribuição do Mandriva Linux, os mesmos dispositivos, com R construído localmente, uma vez que o pango-devel foi instalado

Ele falha em graus variados (isto é, produz uma grade parcialmente ou totalmente preenchida com pontos ou retângulos vazios), seja silenciosamente ou com avisos:

  • na mesma máquina Ubuntu 10.04 em PDF ou PostScript (tentei configurar font = “NimbusSan” para usar fonts URW, não ajuda)
  • no MacOS X.6 (quartzo, X11, Cairo, PDF)

Por exemplo, tentando todas as famílias de fonts PDF disponíveis:

 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) } 

no Ubuntu, nenhum desses arquivos contém os símbolos.

Seria bom fazê-lo funcionar em tantas combinações quanto possível, mas especialmente em algum formato vetorial e duplo – especialmente em PDF.

Quaisquer sugestões sobre configurações de dispositivos de fonte / charts que fariam esse trabalho seriam bem-vindas.

Acho que você está sem sorte Ben, pois, de acordo com algumas annotations de Paul Murrell, o pdf() só pode manipular codificações de byte único. As codificações de múltiplos bytes precisam ser convertidas em um equivalente de byte único, e aí está o atrito; por definição, as codificações de byte único não podem conter todos os glifos que podem ser representados em uma codificação de múltiplos bytes como, por exemplo, UTF-8.

As notas de Paul podem ser encontradas aqui, onde ele sugere algumas soluções usando dispositivos PDF baseados no Cairo, usando cairo_pdf() em sistemas Linux e Mac OS adequadamente dotados, ou através do pacote Cairo no MS Windows.

Eu descobri que o dispositivo cairo_pdf é completamente insuficiente: a saída é marcadamente diferente da renderização em pdf e na canvas, e seu suporte a plotagem é incompleto.

No entanto, há uma solução simples no OS X: use o dispositivo de quartz “normal” e defina seu type para pdf :

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

Infelizmente, no meu computador, isso ignora a família de fonts e sempre usa a Helvetica (embora a documentação afirme que o padrão é Arial).

Existem pelo menos duas outras pegadinhas:

  • pdf converte hífens em minuses . Isso pode nem sempre ser o que você quer, mas é bastante útil para compor números negativos. O encadeamento vinculado descreve soluções alternativas para isso.
  • É claro que é específico da plataforma e só funciona no OS X.

(Eu percebo que OP menciona brevemente o dispositivo Quartz, mas este segmento é frequentemente visto e eu acho que esta solução precisa de mais destaque.)

Outra solução pode ser usar o tikzDevice, que agora pode usar o XeLaTeX com caracteres Unicode. O arquivo tex resultante pode então ser compilado para produzir um pdf. O problema ainda é que você deve ter uma fonte no seu sistema que contenha os caracteres.

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

Na primeira vez, isso levará um longo tempo.

Você já tentou incorporar uma fonte no PDF ou include uma para usuários do Mac que funcionaria?