フォントをアウトライン化するRパッケージstring2pathをCRANリリースしました

そういえば日本語ブログにぜんぜん書いてないことに気付いたので、いちおう。 string2pathというRパッケージをCRANリリースしました。

特筆すべき点として、このパッケージはRustを使っています。 これはextendrというフレームワークによって実現されています。extendrについては以前ブログで書いたので、興味がある方はそちらをご参照ください。

使い方

使い方はこんな感じです。

library(string2path)
library(ggplot2)

d <- string2path("カラテが\n高まる。", "path/to/ipaexg.ttf")

ggplot(d) +
  geom_path(aes(x, y, group = path_id, colour = factor(glyph_id)), size = 1.5) +
  theme_minimal() +
  coord_equal() +
  theme(legend.position = "top") +
  scale_colour_viridis_d(option = "H")

f:id:yutannihilation:20211016222958p:plain:w450

アウトライン化するにはフォントデータが必要です。 上のコード例では"path/to/ipaexg.ttf"を指定していますが、TTF形式とOTF形式のフォントならなんでも使えます(つまり拡張子が.ttcとなってるやつはダメ)。 システムにインストールされているフォントファイルの場所は、systemfonts::system_fonts()で一覧が見れます。

string2pathパッケージには string2path() の他に、三角ポリゴンに分割された結果を返してくれる以下の2つの関数もあります。詳しくはREADMEなどをご参照ください。

  • string2stroke(): 太さをもったアウトライン
  • string2fill(): 塗りつぶし

Rustを使ったパッケージをCRANでリリースするには

CRANでRustを使う上での困難は、ざっくり以下の3点に要約できます。

  1. CRANのマシンは、Linux以外では(?)Rustがインストールされていない
  2. Rustがインストールされていても、~/.cargoなどのキャッシュを更新するとCRAN repository policy違反になる
  3. 32-bit SolarisはRustのサポート対象外

1は、コンパイル済みのバイナリをGitHubなどに置いておいて、それをダウンロードするようにすれば解決できます。ここはそれほど難しくないです。

2は、CARGO_HOMEをパッケージインストールの一時ディレクトリに設定することでクリアできます。ただ、常に一時ディレクトリでクリーンビルドするのは開発効率が落ちるので、ちょっと工夫が必要です。string2pathは若干コードが複雑になってしまったのであまり参考にならない気もしますが、興味があればこのあたりを見るとヒントになるかもです。

3は、なんと、 CRANに「Solarisは対象外にしてくださいお願いします!」と言えばすり抜けられます。CRAN check resultにSolarisが含まれてないパッケージがいくつかあることは知っていたんですが、どうやるんだろうと思っていたらまさかのこんなアナログな方法だとは。。

という感じでふわっとした解説しかできないのですが、もしRustを使ったパッケージのCRANリリースを検討されている方がおられれば、アドバイスできることもあるかもしれないので気軽に声をかけてください。r-wakalangの#rustチャンネルとか、Twitterとかで。あるいはextendrのDiscord(英語、公式サイトの右上のDiscordアイコンから入れる)で直接相談するのもいいかもです。