fontconfig
LilyPond
LilyPondDay 20

LilyPondで欧文フォントと和文フォントを組み合わせる

これは「LilyPond Advent Calendar 2017」の20日目の記事です。

LilyPondは高品位の楽譜を作成することができます。和文フォントを扱うこともできるので歌詞などに日本語を使うことができます。

和文フォント

先日の記事に書いた通り、和文フォントはデフォルトで具体的な指定がなく、日本語を使うとどんなフォントが使われるか環境によって変わってしまいます。複数の環境で同じ出力を得たければ、具体的なフォント名を指定しておくべきです。では、実際に指定してみましょう。

何も指定しない場合

筆者の環境では何も指定しないと和文フォントに「源ノ明朝」が使われます1。何も指定しなかった場合のサンプルです2

snow-none.ly
\version "2.19.65"
\include "lilypond-book-preamble.ly"

<<
  \relative
  {
    \clef treble
    \key f \major
    \time 2/4
    \tempo "Moderato" 4 = 92

    c''8. d16 c8. d16 | c4 a8 r |
    a8. bes16 a8. bes16 | a4 f8 r |
  }
  \addlyrics
  {
    ☃ゆ "" き や こん こ |
    あ ら れ や こん こ
  }
>>
snow-none.png

和文フォントを指定

「源ノ明朝」の☃は背景に雪が降っていません。歌詞の内容的には雪が降っていてほしいので、背景に雪が降っている「IPA明朝」を指定してみましょう3

snow-ipamincho.ly
\version "2.19.65"
\include "lilypond-book-preamble.ly"

\paper
{
  #(define fonts
    (set-global-fonts
     #:roman "IPA Mincho"
   ))
}

<<
  \relative
  {
    \clef treble
    \key f \major
    \time 2/4
    \tempo "Moderato" 4 = 92

    c''8. d16 c8. d16 | c4 a8 r |
    a8. bes16 a8. bes16 | a4 f8 r |
  }
  \addlyrics
  {
    ☃ゆ "" き や こん こ |
    あ ら れ や こん こ
  }
>>
snow-ipamincho.png

確かに☃の背景に雪が降るようになりましたが、なんと言ったらいいのか非常に残念な感じの楽譜になってしまいました。どこが残念なのかわかるでしょうか。速度記号の「Moderato (♩=92)」のフォントまで(四分音符を除いて)「IPA明朝」になってしまったところです。上記サンプルの set-global-fonts によるフォント変更はLilyPondのromanフォントファミリをデフォルトから「IPA明朝」へ変更するものです。LilyPondは速度記号のテキスト部分(「Moderato」の部分)をromanフォントファミリのボールド、メトロノーム記号部分(「(♩=92)」の音符以外)を同レギュラーにしています。ですから、romanフォントファミリを「IPA明朝」へ変更すれば、ここも「IPA明朝」に変更されてしまいます。「IPA明朝」は元々使われていた「TeX Gyre Schola」と同じセリフ体ではありますが、固定幅フォントですしボールドも無いので4かなりみっともない感じになってしまっています5。もちろん set-global-fonts を使って全体のromanフォントファミリを変更するのではなく、場所ごと個別にフォント変更をかけてやれば、このようなことにはなりません。上記サンプル程度なら個別のフォント変更をしても大した手間ではないかもしれませんが、もっと大規模な楽譜でいちいち個別にフォントを指定するのはかなり面倒です。また、先日の記事の「昭和7年/ 1932年」のように和文(漢字)と欧文(数字とスラッシュ)を混ぜ書きしているようなところでいちいちフォント変更をかけていたらきりがありません。

和文フォントと欧文フォントを組み合わせる

和文は「IPA明朝」欧文は「TeX Gyre Schola」といったように、和文と欧文を組み合わせて指定できれば問題なさそうです。先日の記事では、LilyPondのデフォルトフォントはエイリアスになっていて、エイリアスの定義は複数のフォントが並んだリストになっている、という説明をしました。また、リストの一番最初に載っているフォントに存在する文字はすべてその最初のフォントが使われ、存在しなかった文字はリストの次のフォント、そこにも無ければさらに次のフォント、といように1文字ごとにフォールバックしていく、という説明もしました。

組み合わせるには

「TeX Gyre Schola」は欧文フォントで和文を含んでいませんから、リストのトップを「TeX Gyre Schola」にして、次を「IPA明朝」にすれば和文欧文の混ぜ書きに対応できそうです。というわけでやってみましょう6

snow-texgyre-ipamincho.ly
\version "2.19.65"
\include "lilypond-book-preamble.ly"

\paper
{
  #(define fonts
    (set-global-fonts
     #:roman "TeX Gyre Schola,IPA Mincho,"
   ))
}

<<
  \relative
  {
    \clef treble
    \key f \major
    \time 2/4
    \tempo "Moderato" 4 = 92

    c''8. d16 c8. d16 | c4 a8 r |
    a8. bes16 a8. bes16 | a4 f8 r |
  }
  \addlyrics
  {
    ☃ゆ "" き や こん こ |
    あ ら れ や こん こ
  }
>>
snow-texgyre-ipamincho.png

これで速度記号は見慣れたフォントになりましたし、☃は雪が降るようになりました。

他のフォントの組み合わせ

ここまでにLilyPondのromanフォントファミリについて和文フォントと欧文フォントを組み合わせた例を示しました。他のフォントファミリについても同じように組み合わせることができます7

IPAフォントとTeX Gyreフォント

IPAフォントとTeX Gyreフォントを組み合わせるには、以下のようにすればよいでしょう。

  #(define fonts
    (set-global-fonts
     #:roman "TeX Gyre Schola,IPA Mincho,serif,"
     #:sans "TeX Gyre Heros,IPA Gothic,sans-serif,"
     #:typewriter "TeX Gyre Cursor,IPA Gothic,monospace,"
   ))

TeX Gyreフォントを先頭にして、2番目をIPAフォントにすることによって、TeX Gyreフォントに含まれる英数字などはTeX Gyreフォント、それ以外の漢字ひらがなカタカナ☃はIPAフォントが使われるようになります。どちらのフォントにも含まれない文字があった時には、最後に設定してある総称フォントファミリのserif, sans-serif, monospaceまでフォールバックします。普通の英数字と漢字ひらがなカタカナ☃以外は絶対に使わないというのであれば総称フォントファミリは不要でしょうけど、設定しておくことでFontconfigがセリフ体、サンセリフ体、等幅フォントから選んでくれるので、一応トンチンカンなフォントが選ばれてしまうことは防げます8

IPAexフォントとTeX Gyreフォント

IPAexフォントと組み合わせるなら以下のようにします。

  #(define fonts
    (set-global-fonts
     #:roman "TeX Gyre Schola,IPAex Mincho,serif,"
     #:sans "TeX Gyre Heros,IPAex Gothic,sans-serif,"
     #:typewriter "TeX Gyre Cursor,IPAex Gothic,monospace,"
   ))

源ノ明朝/源ノ角ゴシックとTeX Gyreフォント

源ノ明朝/源ノ角ゴシックとTeX Gyreフォントを組み合わせるなら以下ようにします9

  #(define fonts
    (set-global-fonts
     #:roman "TeX Gyre Schola,Source Han Serif,serif,"
     #:sans "TeX Gyre Heros,Source Han Sans,sans-serif,"
     #:typewriter "TeX Gyre Cursor,Source Han Sans HW,monospace,"
   ))

より改良した指定方法

ここまで、いくつかの和文フォントとTeX Gyreフォントを組み合わせる例を示してきました。先日の記事ではLilyPondのデフォルトフォントをご紹介しましたが、単純にTeX Gyreフォントをデフォルトにしているわけではありません。TeX Gyreフォントには一部のギリシャ文字やキリル文字、その他様々な言語の文字が含まれていません。LilyPond のデフォルトフォントは、そういった文字でも何とかいろいろな環境で同じような出力ができるように工夫されたものになっています。しかし、和文フォントはどれか一つに決めることが難しかったため指定されていません10。普通にLilyPondを使うには、そこまで複雑な指定をする必要はないと思いますが、より改良した指定方法をご紹介します。

デフォルトフォントに近づける

LilyPondのデフォルトフォントと同じフォントリストを使って、総称フォントファミリの前に和文フォントを入れれば、デフォルトフォントと同じように様々な言語の文字で同じような出力ができ、かつ和文フォントを固定することができます。源ノ明朝/源ノ角ゴシックの場合は以下のようにします。

  #(define fonts
    (set-global-fonts
     #:roman "TeX Gyre Schola,C059,Century SchoolBook URW,Century Schoolbook L,DejaVu Serif,Source Han Serif,serif,"
     #:sans "TeX Gyre Heros,Nimbus Sans,Nimbus Sans L,DejaVu Sans,Source Han Sans,sans-serif,"
     #:typewriter "TeX Gyre Cursor,Nimbus Mono PS,Nimbus Mono,Nimbus Mono L,DejaVu Sans Mono,Source Han Sans HW,monospace,"
   ))

他の和文フォントも同様に指定すればできるでしょう。

ラテン文字とギリシャ文字やキリル文字を同じフォントにする

TeX Gyreフォントは普通の英数字(ラテン文字)と一部のギリシャ文字を含んでいますが、ギリシャ文字の一部とキリル文字を含んでいません。デフォルトフォントのリスト2番目のURW++フォントにはギリシャ文字とキリル文字が含まれています。TeX GyreフォントはURW++フォントをベースにしたものなので、双方よく似てはいるのですが微妙に違うところもあります。すると、デフォルトの状態ではラテン文字、ギリシャ文字、キリル文字(LGCとも言います)でデザインが微妙に違ってしまう、ということが発生します。LGCでデザインの統一性が重要なのであれば、TeX Gyreを使わずに最初からURW++フォントを使った方がよいかもしれません。TeX Gyreと違ってLilyPondに同梱されていないこともありますし、古いURW++フォントだと名前が違っていたりギリシャ文字やキリル文字が含まれていないものもあったりするので最新のURW++フォントが存在するか否か確認する必要はありますが、以下のようにすれば指定できます。

  #(define fonts
    (set-global-fonts
     #:roman "C059,DejaVu Serif,Source Han Serif,serif,"
     #:sans "Nimbus Sans,DejaVu Sans,Source Han Sans,sans-serif,"
     #:typewriter "Nimbus Mono PS,DejaVu Sans Mono,Source Han Sans HW,monospace,"
   ))

リストの1番目はURW++フォント、2番目はDejaVuフォント、3番目が和文フォントの源ノ明朝/源ノ角ゴシック、4番目が総称フォントファミリです。URW++フォントでLGC、和文以外の様々な言語の文字がDejaVuフォント、和文は源ノ明朝/源ノ角ゴシックとなります。

おわりに

LilyPondで欧文フォントと和文フォントを組み合わせて指定する方法を解説しました。デフォルトフォントのまま使用すると、欧文はほぼ固定されていますが和文に関しては環境によって使われるフォントが違ってきます。欧文フォントと和文フォントを組み合わせて指定しておくことにより、どんな環境でもフォントさえあれば同じ出力が得られるようにすることができます。


  1. 先日の記事にも書きましたが、筆者は総称フォントファミリのserifが指定されたら「源ノ明朝」が最優先で出てくるようにFontconfigを設定しています。 

  2. 本稿に貼り付けているPNGはすべて lilypond --png --pdf -danti-alias-factor=8 -dpixmap-format=pnggray -dresolution=100 ソースファイル名.ly でコンパイルしたものです。このコマンドでは同時にPDFも出力されるので、実際に使われているフォントを確認するのはPDFの方を見ています。 

  3. フォント変更に使っている set-global-fonts は本稿執筆時点の最新安定版LilyPond 2.18.2では使えません。また、本稿執筆時点ではまだ開発版の日本語マニュアルにも載っていませんので、英語マニュアルをご覧ください。この機能は3年以上前に実装され2.19.12から使えたもので先日の記事の脚注のものとは異なり筆者は関わっていなかったのですが、長いことドキュメントに記載されていませんでした。さすがに次期安定版2.20の準備が始まりそのまま放置するのも問題だと考え筆者がドキュメントだけ書きましたが、日本語翻訳していただいたものに間に合いませんでした。。。まぁ、というわけで、こちらも本稿が今のところ日本語で書かれた唯一のもの、かもしれません。 

  4. LilyPondはボールドが無いフォントはボールドになりません。ボールドが無いフォントでも無理やりにじませて疑似ボールドにして表示するようなソフトウェアもありますが、見た目がよくないのでボールドを使いたいのであれば素直にボールドがあるフォントを選ぶべきだと思います。 

  5. 可変幅フォントでボールドもあるセリフ体の「源ノ明朝」だとどうなるか試してみましたが、これはこれで「何か違う」感が漂います。 

  6. リストはカンマ区切りですが、カンマの後のフォント名の前にスペースを入れてはなりません。LilyPondの set-global-fonts で指定されたパラメータはPangoの pango_font_description_set_family () に渡されてパースされる、つまりPangoやFontconfigでいうフォントファミリのリストを指定するだけになるのでまだいいのですが、LilyPondの \override で個別にフォントを変更する場合はスペースが問題になることがあります。この場合、指定されたパラメータはPangoの pango_font_description_from_string () に渡されてパースされますが、この仕様がカンマ区切りでフォントのリストを指定した後、スペース区切りで属性を指定するものなので、スペースがあるとそこから先が属性だと認識されてしまうことがあります。そのため、フォント名に含まれているスペースを区切りのスペースだと認識しておかしくなるということもあります。ですので TeX Gyre Schola,IPA Mincho, のように最後にもカンマを入れておいた方が、ここまでフォントリストだと明確に示すことができ、意図しないパースを誘発しないで済むためお勧めです。 

  7. set-global-fonts は音符フォントの設定にも使いますが、ここではテキストフォントの設定のみを示しています。また、set-global-fonts はカテゴリを指定して設定しますが、指定しなかったカテゴリについてはデフォルト値が再設定されます。つまり、ここで示しているようにテキストフォント用のカテゴリ roman, sans, typewriter のみを指定して音符フォントのカテゴリ music, brace やフォントの大きさを示すカテゴリ factor を指定しなかった場合、音符フォントはデフォルトの「Emmentaler」に戻りますし、フォントの大きさもデフォルトに戻ります。逆に音符フォントのカテゴリのみを指定して set-global-fonts した場合には、テキストフォントがデフォルトに戻ってしまいます。テキストフォントと音符フォントを両方ともデフォルトから変更したい場合には、1回の set-global-fonts で同時に変更する必要があります。 

  8. もちろん他系統のフォントには存在するものの同系統のフォントには無い、という文字に対しては他系統のフォントが選ばれてしまうので、完全にトンチンカンなことにならないというわけではありません。また、すべてのフォントが総称フォントファミリに紐づけられているわけではない(どのフォントがどの系統のフォントなのかすべてのフォントについてFontconfigに設定されていない)ことも多いので、本当は同系統のフォントにある文字なのに他系統のフォントが選ばれてしまうこともあります。 

  9. 筆者はIPAフォントやIPAexフォントよりも、ちゃんとボールドが使える源ノ明朝/源ノ角ゴシックの方を好んで使っています。また、先日の記事のように楽譜の断片を複数使うような場合にはTrueTypeフォントであるIPA/IPAexフォントを使いにくいというのもあります。なのでFontconfigの設定で総称フォントファミリが指定されたときに源ノ明朝/源ノ角ゴシックが出てくるようにしています。 

  10. 実はLilyPondのドキュメントでも和文フォントは指定しておらず、デフォルトのままにしています。これは環境によって使える和文フォントが異なる、といいますか普通の開発者やドキュメント執筆者・翻訳者の環境には(日本人ではない方々が大多数ですので)日本語フォントが無いであろうことを想定しているからです。逆に公式サイトに掲載しているドキュメントをビルドする環境はGUBで完全に固定されており、総称フォントファミリで使われる日本語フォントが変わることがありません。本稿執筆時点ではGUBはIPAフォント(IPA明朝/ IPAゴシック)をインストールするようにしており、Fontconfigのデフォルト設定にもIPAフォントが記載されている(総称フォントファミリとIPAフォントが紐づけられている)ので、IPAフォントが使われます。より改良されたIPAexフォントやボールドがある上にTrueTypeフォントではないため楽譜の断片に都合がよい源ノ明朝/源ノ角ゴシックは、Fontconfigのデフォルト設定に存在しない(総称フォントファミリに紐づける設定が無い)ためGUBの設定変更を要するので使っていません。設定ぐらいすればいいではないか、という意見もあるかもしれませんが、この設定はLilyPond一般パッケージに同梱しているFontconfigの設定と連動してしまうので、日本語フォントのためだけに設定変更するのは憚られます。Fontconfigは、昔は有名なフォントをデフォルト設定に取り込んでいたようですが、いつの頃からかデフォルトには取り込まず個別のフォントインストール時に個別のFontconfig設定ファイルを同時にインストールする方法を推奨するように方針変更したみたいです。ですので、IPAフォントやもっと昔のフリーフォントなどはデフォルト設定に記載されているのですが、IPAexフォントなどの新しめのものは記載されていません。普通のディストリビューションのフォントパッケージにはFontconfigの設定ファイルも含まれていて、インストールするだけで総称フォントファミリに紐づけされるようにしてあるものも多いようですが、GUBやLilyPond一般パッケージに同梱されているFontconfigの設定には反映されませんから自分で設定変更しないと総称フォントファミリで使えるようにはなりません。そうした総称フォントファミリでは使えないような環境でも、本稿のように和文フォントを直接指定すれば問題なく使うことができます。