どのLilyPondを使う？lilypond.org公式版vsディストリ配布版

>   これは「[LilyPond Advent Calendar 2017](https://qiita.com/advent-calendar/2017/lilypond)」の4日目の記事です。

LilyPondは高品位の楽譜を作成することができます。フリーソフトウェア / オープンソースなので、料金不要で自由にインストールして使うことができます。

## LilyPondのバリエーション

LilyPondは**どこからダウンロード（入手）してインストールするか**でバリエーションがあります。広く使われているのは次の2種類です[^other]。

  * [lilypond.org](http://lilypond.org)公式版（一般パッケージ）
  * ディストリビューション配布版（ディストリビューション専用パッケージ）

[^other]: DenemoやFrescobaldiなど、他のアプリに同梱されているLilyPondもあります。また、オープンソースですから自分で野良ビルドして使うこともできます。

基本的にはどちらでも同じ、ではあるのですが違うところもあります。どこが違うのでしょうか。

### [lilypond.org](http://lilypond.org)公式版（一般パッケージ）

[lilypond.org](http://lilypond.org)からダウンロードできるパッケージです。本稿執筆時点での最新版 Ver. 2.19.80 の場合、以下の8種類のプラットフォーム向けパッケージが用意されています[^platforms]。

  * GNU/Linux x86
  * GNU/Linux 64
  * GNU/Linux PPC
  * FreeBSD i386
  * FreeBSD amd64
  * MacOS X x86
  * MacOS X PPC
  * Windows

[^platforms]: ユーザがいないため、ほとんどテストされていないものもあります。例えば GNU/Linux PPC や MacOS X PPC などは、本当に使っている人がいるか疑問ですし、プラットフォーム依存でうまく動かない問題が潜んでいる可能性もあります。逆に GNU/Linux 64 や MacOS X x86、Windowsなどは比較的多くのユーザが使っているので問題があっても発見されやすく、残っている問題は比較的少ないと思います。

ディストリビューション配布版と比べたメリットは大きく2つです。

  * 最新のLilyPondが使える（バージョンが新しい）
  * 必要なコンポーネントがすべて同梱されている[^components]

[^components]: マイナーなプラットフォームでは一部のコンポーネントが古いままになっているものがあります。これはコンポーネントの新しいバージョンがビルドできなかったり、ビルドできても何らかの問題で動作しなかったりする場合に仕方なく古いものを使うようにして回避しているためです。

LilyPondの新しいバージョンがリリースされる際には、必ずこのパッケージもリリースされるので、常に最新リリース版が用意されています。また、LilyPondの動作に必要な各種コンポーネントがすべて同梱されており、コンポーネント間のバージョン違いによる問題などが発生しにくくなっています。

### ディストリビューション配布版

Linuxのディストリビューションでパッケージ化されたものです。FreeBSDにも同様なパッケージが用意されています。macOSだとMacPortsやHomebrewで配布されているものが相当すると思えばよいでしょうか。Windowsには、そういうものは無いと思いきや、少々性格が異なる所はありますが実はCygwinで配布されているものがあります。

一般パッケージと比べたメリットは、基本的に、

  * インストールが簡単

です。ただ、ここはお使いのプラットフォームによって少々状況が異なります。

## プラットフォームごとのおすすめ

プラットフォームによってどういう違いがあるのか説明し、お勧めを紹介します。

### Linux, FreeBSD

LinuxやFreeBSDをお使いの場合、普通にOSが提供するパッケージマネージャでLilyPondをインストールすると、ディストリビューション配布版がインストールされます。他のアプリをインストールするのと同じ方法でインストールできるので、お手軽ですし非常に簡単です。ただし大抵の場合、一般パッケージよりバージョンが古くなっています。例えば、本稿執筆時点でDebianやUbuntuでは未だにVer. 2.18.2です[^destold]。2.18.2は2014年3月リリースなので3年以上前のバージョンです。次期安定版2.20に向けたプレリリーステスト版の2.19.80も出ていますし、もう2.18系列を使い続ける理由は無いでしょう。

[^destold]: 本稿執筆時点で最新の安定版LilyPondが2.18.2だから、というのが最大の理由だと思います。

またLilyPond公式ページの[Unix向けダウンロードページ](http://lilypond.org/unix.ja.html)でも、一般パッケージをお勧めしています。

というわけで少々面倒でも一般パッケージをインストールした方がよいでしょう。もしディストリビューション配布版がインストール済であれば、忘れずにアンインストールしてください。

### macOS

macOS自身はLilyPondのパッケージを提供しておらず、普通は一般パッケージを使うことになると思います。macOS向けの一般パッケージにはLilyPadという名前の簡易テキストエディタが付属しているようですが、残念ながら筆者はmacOS環境を持っていないので使ったことはありません。

macOSでもMacPortsやHomebrewをお使いであれば、そこから簡単にディストリビューション配布版をインストールできます。ディストリビューション配布版はバージョンが古いことが多いのですがMacPortsには比較的新しいバージョンも用意されているようですので、そちらを使ってもよいと思います。ただ、macOSをPOSIX (Unix)環境としてお使いであればそれでよいと思いますが、そうでないならば一般パッケージの方がよいでしょう。

### Windows

Windowsの場合は、一般パッケージのインストールが簡単です。普通にインストーラーになっていますから、普通にインストールすればOKです。ですので普通の方には一般パッケージがお勧めです。また、一般パッケージにはLilyPad [^lilypad]という簡易テキストエディタがオマケで付いています。

[^lilypad]: macOS版の一般パッケージに付属しているものと名前は同じですが、プログラムとしては別物です。オマケなので大した機能はないのですが、Windows版LilyPadは、読み込んだファイルの[文字コードを自動判定する機能](https://github.com/gperciva/lilypad/commit/a24851a6acf00ccf1afb2607e195aed361139d3c)（出力はLilyPondがUTF-8入力のみ対応なのでUTF-8固定）やプリンタ回り、フォント回りなどムダにいろいろな機能を詰め込んでみました。さらに、次期バージョンでは[per-monitor high-DPI（ディスプレイ別の高DPI）対応](https://github.com/gperciva/lilypad/commit/9fdb109b6998e3fb3f306deccc1a3a0f71c83d74)まで入ってしまいます。

注意点ですが、インストール直後など、デスクトップ上のLilyPondアイコンをダブルクリックしても何も反応が無い（ように見える）ことがよくあります。これは同梱されているFontconfigがフォントのキャッシュを作っている間、画面に何も出てこないので無反応に見えるのです。特に日本語フォントのような大きなフォントを複数インストールしてあると無反応（に見える）時間が長くなる傾向があり、場合によっては1分とか数分とかかかってしまうことがあります。フォントキャッシュが生成された後であれば、すぐに起動できるようになります。ただし、フォントを新しくインストールしたり、アンインストールしたりした場合には、フォントキャッシュを作り直すため、また時間がかかります[^windowsfontcache]。

[^windowsfontcache]: フォントキャッシュの問題は、Windowsに限ったものではありません。しかし、他のプラットフォームに比べるとかなり大きな影響を受けてしまうので、特に目立つのではないかと思っています。どういうことかといいますと、Windowsではインストールしたフォントは1つのフォルダ（通常は `C:\Windows\Fonts`）に全部平らに並べてあります。一方、Fontconfigはディレクトリ1つにつき1つのキャッシュファイルを生成・更新します。そうするとどうなるか。Windowsへたった一つの小さなフォントをインストールしただけでもキャッシュ更新のため全体のフォント再スキャンが必要になってしまいます。いまどきは日本語のフォントだけでも何種類も入っていたりしますし、日本語以外のCJKフォントもあったりしますから、全部スキャンしていたらかなり時間がかかりますよね。これがフォントごとに別々のフォルダを掘って入れてあるのであれば、全体の再スキャンをしなくて済むのですが。。。

もしCygwinをお使いであれば[^cygwin-wsl]、Cygwinからディストリビューション配布版をインストールする方法もあります。本稿執筆時点でVer. 2.19.65が用意されており、一般パッケージよりは多少古いですが十分使い物になると思います。また、いまのところ定期的に更新されていますので、そのうち新しいバージョンのパッケージが出るものと思います[^lilypond-package]。

[^cygwin-wsl]: （本題とまったく関係ない話）WSL (Windows Subsystem for Linux)の登場でCygwinはもう終わり、なんていう論調もあるようですが、筆者はいまのところそうは思っていません。WSLはマルチユーザで使えませんし、Windows APIも呼べません。CygwinはちゃんとWindowsのユーザがマッピングされていてマルチユーザで使えますし、必要であればWindows APIも使うこともできるので、いろいろ混ぜることができて便利です。例えば筆者が常用しているエディタはCygwin上で動いているEmacsなので、ちゃんとしたPOSIX環境として使うことができるにもかかわらず、画面表示はWindows APIで描画されており、見た目は完全にWindowsアプリです。

[^lilypond-package]: 筆者は新しいバージョンのパッケージが待てない時は、CygportというCygwinパッケージ作成ツールを使い、最新バージョンのLilyPondパッケージを自前で作ることがあります。

### 筆者の環境

常用しているプラットフォームはWindowsなんですが、一般パッケージではなく、好んでCygwin版のLilyPondを使っています。POSIX環境が欲しくてCygwinを常用しているからというのが一番大きい理由ですが、他にもCygwin版のメリットがあるんです。実はWindows版の一般パッケージはUnicodeのファイル名が扱えません[^windows-unicode]。例えば `☃.ly` のようなファイル名のソースファイルはコンパイルできません。ですがCygwin版ならできます。また、Windowsに限らず一般パッケージはフォントキャッシュが独立しているため、フォントを変更した後LilyPondを使うときに必ずキャッシュ更新が走ってしまいます。それに対して、Cygwin版はフォントキャッシュが他のCygwinアプリと共通で、他のアプリがキャッシュを更新してくれることもあるため、LilyPondだけのためにキャッシュ更新が走るということがありません。

また、本稿執筆時点で[Windows版のみ発生する問題](https://sourceforge.net/p/testlilyissues/issues/4975/)が残っているのですが、Cygwinではナゼか発生しません。とはいえ、Windows版でもこの問題を踏むことはまず無いとは思います。

[^windows-unicode]: WindowsのいわゆるA系API（およびCランタイムライブラリのマルチバイト文字版）でUTF-8が扱えないためです。日本語版WindowsではA系APIだとCP932（Shift_JISの方言）しか扱えません。Unicodeに対応するためにはいわゆるW系API（およびCランタイムライブラリのワイド文字版）でUTF-16を使うように書き換える必要があります。ですがLilyPondはPOSIX / Linux発祥なのでUTF-8をchar型配列（マルチバイト文字列）で扱うようになっています。A系APIは文字がchar型でPOSIXと同じなので、LilyPondを動作させるのは簡単にできたのですが、UTF-8が使えないためUnicodeが扱えないのです。一方のW系APIは文字がwchar_t型配列（ワイド文字列）になっていますし、UTF-8ではなくUTF-16が必要になるので書き換えるのは大変です。実は一般パッケージに同梱してあるGhostscriptは、この[W系APIへの書き換えパッチを当てた](https://github.com/gperciva/gub/commit/5032cce2e5e2189f3962c6a0bb4b84a15e845d88)のでUnicodeのファイル名が扱えます。ですが、LilyPond本体はGuileに手を入れなければならなかったり、Guileの1.8系から2.0系への移行問題などもあって[パッチを提案したものの受け入れられていません](https://sourceforge.net/p/testlilyissues/issues/4317/)。なお、Windows 10のInsider Previewでは[システムロケールをUTF-8に変更できるようになっている](https://srad.jp/story/17/11/14/0640253/)なんて話もあるようですので、将来的には特に書き換えなくても扱えるようになるのかもしれません。

## より細かな違い

一般パッケージとディストリビューション配布版のより細かな違いについて説明をしたいと思います。LilyPondを普通に使うにはあまり関係ない話かもしれませんので、よくわからなければ読み飛ばしていただければと思います。さきほど、一般パッケージは必要なコンポーネントをすべて同梱されている、という説明をしました。必要なコンポーネントにはいろいろあるのですが、その中には何らかの設定が必要なものがあります。ディストリビューション配布版は、そういったコンポーネントを同梱していないので、ディストリビューションで提供されるコンポーネントを使う（依存している）ことになります。ですので、各コンポーネントの設定をディストリビューションのシステムレベルで設定してやればLilyPondの動作にもその設定が反映されます。一方で、一般パッケージはすべてのコンポーネントを同梱しているので、例えシステム側（ディストリビューション側）の設定を変更しても、LilyPondの動作には反映されない、ということが発生します。

設定の違いが効いてきそうなコンポーネントの筆頭はFontconfigではないかと思います。ディストリビューション配布版の場合、システムレベルの `/etc/fonts` でFontconfigの設定ができます。筆者はここでTeX用のフォントをFontconfigで扱えるような設定をしています。こんな感じです。

```
# ln -s /usr/share/fontconfig/conf.avail/09-texlive.conf /etc/fonts/conf.d
```

この設定で、ディストリビューション配布版のLilyPondであればTeX用のフォントが使えるようになります。ですが、一般パッケージのLilyPondでは使えるようになりません[^userlevel]。

[^userlevel]: ユーザレベルの設定、たとえば `~/.config/fontconfig` 以下の設定は一般パッケージでもディストリビューション配布版でも反映されます。

## おわりに

基本的には一般パッケージをお勧めします。ですが、他のアプリとの連携を考えて設定を共通化したいとか、何らかの事情がある場合[^dest]にはディストリビューション配布版を使うのもよいと思います。ですが、もしバグレポートをする場合には、一般パッケージの最新版でも再現するか確かめてからにしましょう。

[^dest]: 筆者の場合は常用しているCygwin環境との親和性を考えるとCygwin版を使った方がよいので、あまり一般パッケージを使っていません。