LilyPondとGhostscriptとTeXで作る楽譜と文章を組み合わせたドキュメント

>   これは「[LilyPond Advent Calendar 2017](https://qiita.com/advent-calendar/2017/lilypond)」の4日目の記事です。
>   「[TeX ＆ LaTeX Advent Calendar 2017](https://adventar.org/calendars/2229)」の4日目の記事でもあります。

[LilyPond](http://lilypond.org)は高品位の楽譜を作成することができ、楽器屋さんで「楽譜」として売られているような本の中の楽譜だけのページが続いているような部分を単独で作ることができます。一方、楽譜と文章を組み合わせたようなページが必要になることもありますが、LilyPondは文章の組版が得意ではありません。そういうときは文章の組版が得意なTeXと組み合わせて使おう、ということになります。本稿ではそういった方法をご紹介します。

## はじめに

筆者は先日の[TeXConf2017](https://texconf2017.tumblr.com/)で「Extract PDFmark による PDF ファイルサイズ削減」という題名でお話しをさせていただきました。そこではTeXの文書中にLilyPondで作成した楽譜断片を貼り付ける[サンプル](https://github.com/trueroad/tr-TeXConf2017)を示し、[Ghostscript](https://www.ghostscript.com/)や[Extract PDFmark](https://github.com/trueroad/extractpdfmark/)を使ってファイルサイズを削減する方法をご紹介しました。詳しくはリンク先にアブストラクトや発表資料がありますのでご覧ください。

TeXConf2017での発表の主題は「PDF ファイルサイズ削減」であって[^extractpdfmark]、楽譜と文章を組み合わせることではありませんでしたので、サンプルとしては既にできあがっていて独立した楽譜断片を使いました。ですが、実際に楽譜と文章を組み合わせたドキュメントを作成する場合は、先に個々の楽譜断片をそれぞれ個々の小さなPDFファイルに出力し、それらをLaTeX文章へ間違えないように `\includegraphics` を使って貼り付けていく、といったやり方になり少々手間がかかります。

[^extractpdfmark]: もちろんExtract PDFmarkのご紹介も目的の一つでした。

LilyPondには、こういった流れを自動化する `lilypond-book` というツールがあります。TeXConf2017のサンプルでは使いませんでしたので、本稿では `lilypond-book` を使いつつTeXConf2017でご紹介したGhostscriptとExtract PDFmarkを駆使する方法で、楽譜と文章を組み合わせたPDFを作成してみたいと思います。

## 楽譜と文章を組み合わせたドキュメント

楽譜と文章を組み合わせたドキュメントには、どんなものがあるでしょうか。[LilyPondのマニュアル](http://lilypond.org/doc/v2.19/Documentation/usage/an-example-of-a-musicological-document)には

> テキストのなかには楽譜の例を保持しているものがあります。そのようなテキストには、音楽学の専門書、歌集、このドキュメントのようなマニュアルがあります。

という例が挙げられています。

### 音楽学の専門書

たとえば筆者がLilyPondで楽譜作成する際にいつも手元に置いて参照している「[エッセンシャル・ディクショナリー 楽典・楽譜の書き方](https://www.amazon.co.jp/dp/4636909909//ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=trueroad02-22&linkId=66bb41fa285bc7c95064d2360fbea686)」あたりが該当するでしょうか。この本は記譜の様々なルールが記載されているもので、リンク先で中身を少しご覧いただけるのではないかと思いますが「こういうときにはこういう楽譜にする」といったような内容がたくさん並べてあります[^dictionary]。この本がLilyPondやTeXで作られたか否かはわかりません[^notation]が、間違いなく楽譜と文章を組み合わせたドキュメントでしょう。

[^dictionary]: （余談）筆者は日本語版が出るよりも前に[英語版](https://www.amazon.co.jp/dp/0882847309/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=trueroad02-22&linkId=f05732460e99419bf3c312bae5ca6a15)を買っていました。日本語版が出るという話を耳にして、素晴らしいすぐに買わねばと思いつつも、英語版は買わなくてもよかったかな、とか複雑な心境でした。ですが、両方並べてみると日本語と英語の音楽用語の違いがよくわかって面白いです。「楽譜の読み方」の本はたくさん見つかりますが、書くときにはどういうルールがあるのかちゃんと説明している本はほとんどないので貴重だと思います。なお、記譜法を本当にキッチリカッキリ勉強するのであれば、もっと専門的な本が必要になると思います。筆者は音楽の専門家ではないのでよくわかりませんが[この辺の本](https://www.amazon.co.jp/dp/0800854535/)がそういうものなんだろうと思っています。

[^notation]: 見る人が見ればわかるのでしょうけど、筆者には雰囲気的に違ってそうな気がするな、ぐらいしかわかりません。。。

### 歌集

歌詞は文章（詩）なので、これも楽譜と文章を組み合わせたドキュメントになります。楽譜の音符に付随するような歌詞であったり、発想記号のように楽譜に付随して書かれるような文であればLilyPond単独でも組版できます。といいますか、こういうものは小節や音符の位置に応じて位置を決めたりしなければなりませんから、LilyPondで組版せざるを得ないと思います。一方で、楽譜とは独立して歌詞を掲載するような場合、例えば音符に付随する歌詞をひらがなやカタカナで表記する部分と、漢字かなまじり表記で詩を掲載する部分とがそれぞれある場合には、前者はLilyPond、後者はTeXで組版するなどの分担をすることになると思います。

### マニュアル

LilyPondのマニュアルは「こういうソースファイルはこういう楽譜になる」といった内容が並んでいますので、楽譜と文章を組み合わせたドキュメントですね。筆者はこのマニュアルの執筆にも参加していますので、本稿ではこれをベースにしたいと思います。

#### LilyPondのマニュアル

LilyPondのマニュアルやWebページは[Texinfo](https://www.gnu.org/software/texinfo/)というもので書かれています。TexinfoはGNU公式文書フォーマットで、LilyPondを含めGNU関連プロジェクトのドキュメント形式として広く使われています。Texinfo形式で書かれたファイルを1つ用意すればHTMLやPDFをはじめとする様々な形式のドキュメントを出力することができます。TexinfoからPDFを出力する際にTeXが使われている、というわけです[^plaintex]。

[^plaintex]: このときplainTeXが使われます。LaTeXではありません。

## やってみよう

それでは、実際にLilyPondのマニュアルと同様のTexinfo文書に楽譜を埋め込んだものを作ってみましょう。

### ソースファイル

まずはTexinfoのソースファイルです。

```sample.tely
\input texinfo-ja.tex @c -*- coding: utf-8 -*-

@documentencoding UTF-8
@documentlanguage ja

@settitle 雪に関する音楽
@afourpaper

@titlepage

@title 雪に関する音楽
@author 細田真道

このドキュメントは @code{lilypond-book} を使った
Texinfo サンプルとして作られました。

@end titlepage

@contents

@ifnottex
@node Top
@top 雪に関する音楽

このドキュメントは @code{lilypond-book} を使った
Texinfo サンプルとして作られました。

@end ifnottex

@node 童謡
@chapter 童謡

雪や☃に関する童謡を探してみました。

@node 雪
@section 雪

雪に関する童謡としては非常に有名ですね。
おそらくほとんどの方がご存じなのではないでしょうか。
題名はそのままストレートに「雪」、
「尋常小学校唱歌」第二学年用（明治44年/ 1911年）が初出だそうです。
冒頭部分を以下に示します。

@lilypond[fragment]
<<
  \relative
  {
    \clef treble
    \key f \major
    \time 2/4

    c''8. d16 c8. d16 | c4 a8 r |
    a8. bes16 a8. bes16 | a4 f8 r |
  }
  \addlyrics
  {
    ゆ "" き や こん こ
    あ ら れ や こん こ
  }
>>
@end lilypond

@node ☃雪達磨
@section ☃雪達磨

☃に関する童謡を探してみたところ、こんなものを見つけました。
題名は「雪達磨」、
「新訂尋常小学唱歌」第一学年用（昭和7年/ 1932年）に掲載されているそうです。
冒頭部分を以下に示します。

@lilypond[fragment]
<<
  \relative
  {
    \clef treble
    \key f \major
    \time 2/4

    a'8. bes16 c8 r | a8. bes16 c8 r |
    a8. bes16 d8 c | c4 r |
  }
  \addlyrics
  {
    だ る ま だ る ま
    ☃ゆ き だ る ま
  }
>>
@end lilypond

@bye
```

通常、Texinfoのソースファイルは拡張子 `.texi` ですが、 `lilypond-book` で処理するものについては `.tely` にします。ソースファイル中の `@lilypond` と `@end lilypond` で挟まれた部分がLilyPondによる楽譜の記述です。

### 楽譜の処理（中間ファイルの生成）

LilyPond がインストールされていれば以下のコマンドを実行します。

```
$ lilypond-book --pdf sample.tely
```

これでいくつかの中間ファイルが生成されます。2桁16進数のディレクトリが2つ掘られて、その中にそれぞれ楽譜断片のPDFやPNGなどが生成されます。また、 `sample.tely` から作られた `sample.texi` も生成されます。これは `.tely` にあった `@lilypond` ブロックが楽譜断片のPDFやPNGを張り付けるコマンドに置き換わったものです。

### PDF生成

中間ファイルが生成できたら、いよいよPDFの生成です。XeTeXを使う方法とLuaTeXを使う方法があります[^xetex-luatex]。

[^xetex-luatex]: 本家Texinfoで日本語PDF生成できるのはXeTeXもしくはLuaTeXだけで、pTeXは使えません。本家Texinfo以外に、pTeXでTexinfoを使うことのできる実装がいくつかあるようですので、そういうものを使えばpTeXでもできるかもしれません。

#### XeTeX

XeTeXを使ってPDFを生成します。

```
$ PDFTEX=xetex texi2pdf sample.texi
```

もしかしたらエラーが出るかもしれません。このコマンドを実行するには、

  + Texinfo 6.3 以降
  + XeTeX 0.9998 以降（TeX Live 2012 以降）
  + zhspacing （TeX Live の中国語パッケージに付属）
  + IPAex フォント

が必要です。また、困ったことに環境によってはTexinfoパッケージに日本語用ファイルの一部が同梱されていないことがあるようなので、もし[texinfo-ja.tex](http://svn.savannah.gnu.org/viewvc/*checkout*/texinfo/trunk/doc/texinfo-ja.tex)が見つからないというエラーが出た場合にはダウンロードしてカレントディレクトリに入れてみてください。もしかしたら[txi-ja.tex](http://svn.savannah.gnu.org/viewvc/*checkout*/texinfo/trunk/doc/txi-ja.tex)も必要になるかもしれません。それでもまだ問題が起きるようであれば、最新の[texinfo.tex](http://svn.savannah.gnu.org/viewvc/*checkout*/texinfo/trunk/doc/texinfo.tex)もカレントディレクトリに置いてみてください。これでPDFが生成できるようになると思います。生成したPDFは、筆者の環境では2,193 KBになりました。結構サイズが大きいですね。

**XeTeX出力**

|![sample_3.png](https://qiita-image-store.s3.amazonaws.com/0/212298/4f32f82b-7c83-d5c0-c4e5-222d89695c3f.png)|
|:-:|

#### LuaTeX

もし、XeTeXではなくLuaTeXを使いたいという場合には以下のコマンドに変更します。

```
$ PDFTEX=luatex texi2pdf sample.texi
```

LuaTeXの場合には、

  + Texinfo 6.3 以降
  + LuaTeX 0.95 以降（TeX Live 2016 以降）
  + LuaTeX-ja （TeX Live の日本語パッケージに付属）
  + IPAex フォント

が必要になります。 `texinfo-ja.tex` などもXeTeXのときと同様、別途用意していただくことになるかもしれません。これでPDFを生成したところ、筆者の環境では2,332 KBになりました。XeTeXは中国語用パッケージを半ばムリヤリ使っているのに対して、LuaTeXは日本語用ですから日本語の組版品質はこちらの方が良いと思います。ですが残念なことにLilyPondのマニュアルは公式ビルド環境のLuaTeXが古くてTexinfoが使えず、仕方なくXeTeXを使っています[^lilypond-document-pdf] [^lilypond-japanese-pdf]。

[^lilypond-document-pdf]: LilyPondのPDFドキュメント生成にはXeTeXが採用されていますが、これは別に日本語PDFを生成したかったからではありません。もともとpdfTeXが採用されていたのですが、英語版などで[フォントの問題が発生したためXeTeXに乗り換えた](https://sourceforge.net/p/testlilyissues/issues/4737/)という経緯があります。この時はまだ日本語PDFが生成できるようになっていませんでしたが、将来的にそうしたかったので日本語対応がしっかりしているLuaTeXへの乗り換えを進めようとしました。ですが、当時のLuaTeXでは英語ドキュメントであってもTexinfoがうまく動いてくれずXeTeXしか選択肢が無かったのです。その後、Texinfo本家がVer. 6.3で[日本語PDF生成をサポートした](http://www.trueroad.jp/2016/09/18-01.html)のを機にLilyPondにも英語版と同じXeTeXを使って[日本語PDFを生成できる機構を入れました](https://sourceforge.net/p/testlilyissues/issues/5082/)。いまどきのLuaTeXは英語も日本語も問題なく動作しますが、LilyPondの公式ビルド環境はまだ古いままですのでXeTeXしか使えません。もし新しくなったところで、一度苦労してXeTeXへ乗り換えているので、いまさら再度LuaTeXに乗り換えるというのは無いだろうなぁと思っています。

[^lilypond-japanese-pdf]: それ以前に日本語版のPDFドキュメントは公式サイトにありません。公式ビルド環境はもちろん、ほとんどの開発者の環境には日本語用のファイルがなくて日本語PDF生成ができないため、デフォルトで日本語版ドキュメントはHTMLのみ生成されるようにしてあります。ソースファイル中の[Documentation/ja/GNUmakefile](http://git.savannah.gnu.org/gitweb/?p=lilypond.git;a=blob;f=Documentation/ja/GNUmakefile)のコメントに記載のように、必要な環境を用意してPDF生成を抑止している部分をコメントアウトすれば日本語PDFドキュメントが生成できます。英語版などのPDFドキュメントはデフォルトで生成されるようになっています。

**LuaTeX出力**

|![sample_3.png](https://qiita-image-store.s3.amazonaws.com/0/212298/8f5d465c-47bb-1536-9dee-d1d9358aee6b.png)|
|:-:|

### HTML生成

TexinfoはWebページも生成できます。

```
$ makeinfo --html -o . sample.texi
```

これで `index.html` ができたと思います。ブラウザで開いてみると楽譜断片がPNGで張り付けられているのがわかると思います。

## ファイルサイズ削減

筆者の環境で生成したPDFはXeTeX、LuaTeXともに2 MBを超えるファイルサイズになりました。これをTeXConf2017でご紹介したGhostscriptとExtract PDFmarkを使った方法で小さくしてみましょう。中間ファイルも更新する必要がありますので、以下のようにして一旦削除してください。

```
$ rm -r ??/
```

### 楽譜の処理（中間ファイルの生成）

ファイルサイズ削減用の新しい中間ファイルを作ります。

```
$ lilypond-book --pdf --process='lilypond -dbackend=eps --pdf -dfont-export-dir=fonts -dgs-never-embed-fonts --bigpdfs' sample.tely
```

本稿執筆時点で最新のVer. 2.19.80では上記の通りですが、TeXConf2017でもお話しした理由により将来変更予定です。より新しいバージョンをお使いであれば、以下のようにしてみてください。

```
$ lilypond-book --pdf --process='lilypond -dbackend=eps --pdf -dfont-export-dir=fonts --pspdfopt=TeX-GS' sample.tely
```

楽譜断片のPDFにはフォントが埋め込まれなくなりました[^truetype]。そして新しく `fonts` ディレクトリ以下に楽譜断片で使っていたフォントがPostScript形式で置かれます。

[^truetype]: TrueTypeフォントは埋め込まれます。これはTeXConf2017でもご説明しましたが、埋め込まないと文字化けを起こすからです。

### PDF生成

最初のPDF生成は今までと同じです。つまり、

```
$ PDFTEX=xetex texi2pdf sample.texi
```

もしくは

```
$ PDFTEX=luatex texi2pdf sample.texi
```

です。これで生成された `sample.pdf` には楽譜断片のフォントが埋め込まれていませんのでファイルサイズは小さいですが正常に表示できません。筆者の環境ではXeTeXで47 KB、LuaTeXで186 KBです。

次にExtract PDFmarkで宛先名などを抽出します。

```
$ extractpdfmark sample.pdf > sample.pdfmark.ps
```

そして最後にGhostscriptでPDFを処理し、最終PDFを生成します。

```
$ gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=sample-embeded.pdf fonts/*.font.ps sample.pdf sample.pdfmark.ps
```

これで正常に表示できて、ファイルサイズが小さいPDFが得られました。筆者の環境ではXeTeX、LuaTeXともに1,139 KBとなりました。サイズが半分ぐらいになりましたので、かなり小さくなりましたね[^sizeopt]。

[^sizeopt]: 筆者の環境では日本語フォントに源ノ明朝が選択されるようにしたので、ここまで差が出たものと思います。TrueTypeフォントであるIPA明朝などが選択される環境では、ここまでの差にはならないと思います。とはいえ文章中の楽譜断片の数が増えれば増えるほど差は開いていきますので、TeXConf2017や本稿でご紹介した方法はどんなフォントでも有用だと思っています。

## おわりに

LilyPondとGhostscriptとTeXを使って楽譜と文章を組み合わせたドキュメントを作る方法をご紹介しました[^pdf-postscript]。本稿ではTexinfoを使いましたが、もちろん普通のLaTeXでも同様のことができますので試してみていただけると幸いです。LaTeXの場合は拡張子を `.lytex` にして、`\begin{lilypond}` と `\end{lilypond}` で挟めばよいです。詳しくは[使用方法](http://lilypond.org/doc/v2.19/Documentation/usage/index.ja.html)をご覧いただければと思います。

[^pdf-postscript]: ご紹介した方法は、楽譜断片をPDFで用意してTeXへ貼り付けています。TeXConf2017では、楽譜断片もTeXの出力もPDFではなくPostscriptにしておいて、最後の最後にPostscriptからPDFへ変換する方法もあるのではないか、というご指摘もいただきました。確かにそういう方法でPDFを小さくすることもできると思いますが、LilyPondのマニュアルPDFを生成するための要件としてはXeTeX（もしくはLuaTeX）を使用せざるを得ず、すると楽譜断片もTeX出力もPDFにせざるを得ず、残念ながらPostscriptで処理することができません。。。普通にpLaTeXでやる分には十分できると思います。