1.2 コマンド ラインの使用方法

この節にはコマンド ラインで LilyPond を使用するための追加情報が含まれます。これにはプログラムに追加オプションを渡す必要があるかもしれません。さらに、いくつかの特別なプログラム (midi2ly など) はコマンド ラインからしか利用できません。

ここで ‘コマンド ライン’ とは、OS の中にあるコマンド ラインを意味します。Windows ユーザは ‘DOS シェル’ や ‘コマンド シェル’ ‘コマンド プロンプト’ という言葉の方が馴染みがあるかもしれません。MaxOS X ユーザは ‘ターミナル’ や ‘コンソール’ という言葉の方が馴染みがあるかもしれません。MaxOS X ユーザは追加のセットアップが必要かもしれません。 MacOS X を参照してください。

OS のコマンド ラインの使用方法についての説明はこのマニュアルが扱う範囲ではありません。コマンド ラインに馴染みがない場合は、その内容を扱っている他のドキュメントをあたってください。


lilypond を呼び出す

lilypond 実行可能形式ファイルはコマンド ラインから以下のように呼び出されます。

lilypond [option]… file

拡張子を持たないファイル名で呼び出された場合、‘.ly’ が最初に試されます。stdin から入力を読み込む場合には、file に対してダッシュ (-) を使用します。

filename.ly’ が処理されると、lilypond は出力として ‘filename.pdf’ を作り出します。いくつかのファイルを指定することもできます。その場合、それらのファイルは個々に処理されます。1

filename.ly’ が複数の \book ブロックを含んでいる場合、残りの score は ‘filename-1.pdf’ から始まる番号付きのファイルに出力されます。さらに、output-suffix がベース名と番号の間に挿入されます。例えば、 ‘filename.ly’ が以下の内容を含んでいる場合、

#(define output-suffix "violin")
\score { … }
#(define output-suffix "cello")
\score { … }

LilyPond は ‘filename-violin.pdf’ と ‘filename-cello-1.pdf’ を出力します。


標準シェルで LilyPond を使う

LilyPond はコマンドラインアプリケーションなので、LilyPond を呼び出すために ‘シェル’ の機能をうまく利用することができます。

例えば,

lilypond *.ly

は、カレントディレクトリのすべての LilyPond ファイルを処理します。

コンソール出力をリダイレクトする(例えばファイルへ)のも有用でしょう。

lilypond file.ly 1> stdout.txt
lilypond file.ly 2> stderr.txt
lilypond file.ly &> all.txt

上記コマンドはそれぞれ ‘普通の’ 出力、‘エラー’ のみ、‘すべて’ 、 をテキストファイルにリダイレクトします。あなたの使用しているシェル、コマンドプロンプト (Windows)、ターミナルやコンソール (MacOS X) がリダイレクトをサポートしているか、あるいは構文が異なるかどうかは、そのシェルのドキュメントを調べてください。

以下は、カレントディレクトリ以下のすべての入力ファイルを再帰的に探し、処理する例です。出力ファイルは元の入力ファイルのあるディレクトリではなく、コマンドを実行したディレクトリに置かれます。

find . -name '*.ly' -exec lilypond '{}' \;

これは MacOS X ユーザでも使えるでしょう。

Windows ユーザは

forfiles /s /M *.ly /c "cmd /c lilypond @file"

スタートメニューから スタート > アクセサリ > コマンドプロンプト とたどるか、検索ウィンドウで ‘コマンドプロンプト’ と入力して、 コマンド プロンプト を起動し、これらのコマンドを入力します。

または、入力ファイルを含むすべてのサブフォルダを含む、最上位のフォルダを明示的に指定できる /p オプションもあります;

forfiles /s /p C:\Documents\MyScores /M *.ly /c "cmd /c lilypond @file"

最上位フォルダ名がスペース文字を含む場合は、パス全体をダブルクオーテーションで囲む必要があります。;

forfiles /s /p "C:\Documents\My Scores" /M *.ly /c "cmd /c lilypond @file"

LilyPond の基本的なコマンド ライン オプション

以下のオプションがサポートされます。

-d, --define-default=var[=val]

LilyPond の高度なコマンド ライン オプション を参照してください。

-e, --evaluate=expr

.ly’ ファイルを解析する前に Scheme expr を評価します。複数の -e オプションが与えられた場合、それらは順番に評価されます。

Scheme 表記は guile-user モジュールの中で評価されます。そのため、expr の中で (define-public a 42) のような定義を使いたいのならば、コマンド ラインで以下を使用して、

lilypond -e '(define-public a 42)'

.ly’ ファイルの先頭に以下を含めます.

#(use-modules (guile-user))

Note: Windows ユーザはシングル クォートではなく、ダブル クォートを使う必要があります。

-E, --eps

EPS ファイルを生成します。

このオプションは LilyPond のコマンドラインオプションに --ps, -dbackend=eps, と -daux-files='#f' を指定するのと同じです。

-f, --format=format

(主な)出力ファイルのフォーマットを指定します。format の選択肢は ps, pdf, または png です。

例: lilypond -fpng foo.ly

svg フォーマットや eps フォーマットを出力するには -dbackend オプションを用います。 LilyPond の高度なコマンド ライン オプション を参照してください。

-h, --help

使用方法の要約を表示します。

-H, --header=field

ヘッダ フィールドをファイル ‘BASENAME.field’ に吐き出します。

例えば、 ‘foo.ly’ という入力ファイルが以下の内容を含んでいる場合、

\header { title = "bar" }
\score { c1 }

コマンド

lilypond -H title foo.ly

を実行すると、文字列 bar を含んだプレーンテキストファイル ‘foo.title’ が作られます。

-i, --init=file

init ファイルとして file をセットします (デフォルト: ‘init.ly’)。

-I, --include=directory

directory を入力ファイルのサーチ パスに相対パスとして追加します。デフォルトではカレントディレクトリのみが検索されます。

複数の ‘-I’ オプションを与えることができます。検索はカレントディレクトリから開始され、入力ファイルが見つからない場合は、最初の ‘-I’ で指定されたディレクトリ、そして二番目の ‘-I’ で指定されたディレクトリ、というように検索します。

Note: チルド記号 (~) を ‘-I’ と共に使用すると、シェルによっては予期しない結果をもたらす場合があります。

Windows ユーザは、ディレクトリのパスの最後にスラッシュを含める必要があります。

-j, --jail=user,group,jail,dir

[このオプションは OS が chroot 機能をサポートする場合のみ有効です。特に、 Windows はサポートしていません。]

lilypond を chroot jail 環境で実行します。(訳者: chroot jail 環境とはセキュリティのためにカレント プロセスに対してルート ディレクトリの位置を変更すること。)

--jail’ オプションは、Web サーバ経由で LilyPond 譜刻を提供する時や LilyPond が外部ソースから送られてきたコマンドを実行する時に、--dsafe よりも自由度の高い代替手段を提供します。 (LilyPond の高度なコマンド ライン オプション を参照してください。)

--jail オプションはコンパイル プロセスの開始直前に lilypond のルート ディレクトリを jail に変更します。それから、ユーザとグループを usergroup に変更して、カレント ディレクトリを dir に変更します。これにより、jail (牢獄) から抜け出せないことを (少なくとも理論上は) 保証します。--jail を指定した lilypond の実行は root (ユーザ名) として行う必要があります。通常、これは sudo を用いた安全な方法で行います。

jail のセットアップは比較的複雑な問題です。LilyPond がソースをコンパイルするのに必要とされるものすべてを jail の内部 で見つけられるということを保証しなければならないからです。一般的なセットアップには以下の項目が含まれます:

専用のファイルシステムをセットアップする

noexec, nodev, nosuid などのセーフ オプションでマウントするための専用ファイルシステムを作成すべきです。こうすることで、LilyPond から実行可能形式ファイルを実行したり、デバイスに直接書き込むことは不可能になります。専用のパーティションを作成することを望まないのなら、適当なサイズのファイルを作成し、それを使用してループ デバイス (ループバック デバイス) をマウントしてください。専用ファイルシステムはさらに、LilyPond が許可されたディスク容量以上には書き込めないということを保証します。

専用のユーザをセットアップする

jail 内部で LilyPond を実行する際、低い権限を持つ専用のユーザとグループ (仮に lily/lily とします) で行うべきです。このユーザが書き込み可能なディレクトリが 1 つだけ存在すべきであり、それを dir に渡します。

jail の準備をする

LilyPond は実行中にいくつかのファイルを読み込む必要があります。それらのファイルをすべて jail にコピーしておきます。それらのファイルが本当のルート ファイル システムで存在しているパスと同じパスにコピーします。LilyPond インストールの内容すべて (例えば、‘/usr/share/lilypond’) をコピーすべきです。

問題が発生した場合、その原因を突き止める最も簡単な方法は strace を使って LilyPond を実行することです。これによりどのファイルが見当たらないのかがわかります。

LilyPond を実行する

noexec でマウントされた jail の中では、外部プログラムを実行することは一切できません。そのため、外部プログラムを必要としないバックエンドで LilyPond を実行しなければなりません。すでに述べたように、jail モードでの LilyPond の実行はスーパーユーザ権限で行われなければならず (もちろん、その権限はすぐに外されます)、たぶん sudo を使います。LilyPond が使用可能な CPU 時間を数秒に制限する (例えば、ulimit -t を使って) というのも良い方法です。さらに、OS がサポートしているのなら、割り当て可能なメモリ容量を制限するというのも良い方法です。chroot jail 環境で LilyPond を実行する も参照してください。

-l, --loglevel=level

コンソール出力の饒舌さを level にセットします。取り得る値は以下の通りです:

NONE

何も出力しません。エラー メッセージさえも出力しません。

ERROR

エラー メッセージだけを出力します。警告や進捗メッセージは出力しません。

WARN

警告とエラー メッセージを出力し、進捗メッセージは出力しません。

BASIC_PROGRESS

基本的な進捗メッセージ (成功メッセージ)、警告、それにエラー メッセージを出力します。

PROGRESS

すべての進捗メッセージ、警告とエラー メッセージを出力します。

INFO

進捗メッセージ、警告、エラーそれに追加の実行情報を出力します。 これがデフォルトです。

DEBUG

饒舌なデバッグ出力を含む、出力可能なメッセージをすべて出力します。

-o, --output=file
-o, --output=folder

デフォルトの出力ファイルとして file をセットします。セットした名前のフォルダが存在する場合、 folder に入力ファイルから取ったファイル名で出力されます。どちらの場合にも適切な接尾辞が追加されます (つまり、PDF ならば拡張子 ‘.pdf’ が追加されます)。

-O, --pspdfopt=key

key へ PS/PDF 最適化を設定します。選択肢は:

size

非常に小さい PS/EPS/PDF ドキュメントを生成します。 これがデフォルトです。

LilyPond の Scheme コマンドラインオプション -dmusic-font-encodings='#f'-dgs-never-embed-fonts='#f' を指定した場合と同じです。

TeX

PdfTeX, LuaTeX, XeTeX ドキュメントにインクルードされるのに最適化されたファイルを生成します。

LilyPond の Scheme コマンドラインオプション -dmusic-font-encodings='#t'-dgs-never-embed-fonts='#f' を指定した場合と同じです。

TeX-GS

LilyPond によって生成された PDF を TeX ドキュメントに複数インクルードしたい場合は、このオプションを使い、TeX によって生成された PDF を Ghostscript で後処理してください。

LilyPond の Scheme コマンドラインオプション -dmusic-font-encodings='#t'-dgs-never-embed-fonts='#t' を指定した場合と同じです。

--ps

PostScript を生成します。このオプションは -fps と同じです。

--png

各ページの図を PNG フォーマットで生成します。このオプションは -fpng と同じです。

画像の解像度を N DPI に設定するには以下のようにします。

-dresolution=N
--pdf

PDF を生成します。これがデフォルトで、-fpdf と同じです。

-s, --silent

進行状況を表示せず、エラーメッセージのみ表示します。これは -lERROR と同じです。

-v, --version

バージョン情報を表示します。

-V, --verbose

冗長表示モードにします: 読み込むすべてのファイルのフル パスを表示して、時間情報などを表示します。これは -lDEBUG と同じです。

-w, --warranty

GNU LilyPond の保証責任を表示します。(GNU LilyPond には保証責任はありません!)


LilyPond の高度なコマンド ライン オプション

オプション ‘-d’ は LilyPond の Scheme 関数 ly:set-option のコマンドラインインタフェースです。つまり、ここで示しているすべてのオプションは ‘.ly’ ファイルの中で設定することが可能です。

-d, --define-default=option-name[=value]
-d, --define-default=no-option-name

内部 Scheme シンボル option-namevalue を設定するのと同じです。例えば、コマンドラインオプション

-dbackend=svg

は LilyPond 入力ファイルに

#(ly:set-option 'backend 'svg)

を書くことと同じです。

value が指定されない場合、 #t (真偽値以外を取る場合は、おかしな結果になるかもしれません)が使われます。option-name に接頭辞 no- を付けると、そのオプションは ‘off’ つまり #f が使われます。例えば、

-dpoint-and-click='#f'

-dno-point-and-click

と同じです。

[‘#’ 文字は多くのシェルでコメントの開始を意味することに注意してください。そのため、それを含む式は常にクォートすることをお勧めします。]

次の表に、サポートされているすべてのオプション名と値を示します。Scheme コード内では、オプション値は関数 ly:get-option で読み取ることができます。

anti-alias-factor num

(与えられた因数 num を用いて) 高解像度で描画して、その結果をスケールダウンすることにより、PNG 画像の輪郭がギザギザになることを防ぎます。デフォルト: 1.0

aux-files bool

bool#t ならば、 eps バックエンドオプションを使っているときに ‘.tex’, ‘.texi’, と ‘.count’ ファイルを生成します。デフォルト: #t

backend symbol

symbol を LilyPond 出力のバックエンドとして使用します。 選択肢は:

ps

こればデフォルトです。 Postscript ファイルはTTF, Type1, それに OTF フォントを埋め込みます。フォントのサブセットは作成されません。日本語のような ‘東洋’ の文字セットを用いるとファイルが非常に大きくなる可能性があることに注意してください。

PDF 出力には ps バックエンドが使われます。出力された PS データは Ghostscript の ps2pdf で後処理され、デフォルトでフォントのサブセットが作成されます。

eps

lilypond-book コマンドのデフォルトです。これは、1 つのファイルにすべてのページとフォントを埋め込んだものと、ページ毎に分離しフォントを埋め込まない eps ファイルの、両方を吐き出します。

null

楽譜を出力しません。-dno-print-pages と同じ効果を持ちます。

scm

内部的な Scheme ベースの描画コマンドを吐き出します。

svg

ページ毎の SVG (Scalable Vector Graphics) ファイルが全ページ分作られます。音楽グリフはベクタ画像に変換されますが、文字フォントは SVG ファイルには埋め込まれません。 そのため、テキストや歌詞の最適な描画を得るためには、SVG ビュアーに関連するテキストフォントが必要となります。SVG ビュアーが対応していないことがあるので、‘フォントリスト’ や ‘フォントエイリアス’ を使用しないことをお勧めします。Web Open Font Format (WOFF) ファイルを使うときには、追加の -dsvg-woff スイッチが必要となります。

check-internal-types bool

bool#t なら、全てのプロパティ代入について型チェックを行います。デフォルト: #f

clip-systems bool

bool#t なら、楽譜から断片を取り出します。これを使用するには、 \layout ブロックに clip-regions 関数が定義されている必要があります。 音楽の断片を抽出するを参照してください。 ‘-dno-print-pages’ と一緒に用いられた場合、断片は全く出力されません。デフォルト: #f

crop bool

bool#t なら、すべての楽譜とヘッダをマージンなしの ‘単一ページ’ 出力に合わせます。デフォルト: #f

datadir

データファイル パスの接頭辞です。読み取り専用で、設定しても効果がありません。

debug-gc bool

bool#t なら、メモリに関するデバッグ用の統計を吐き出します。

debug-gc-assert-parsed-dead bool

メモリに関するデバッグ用: bool#t なら、パースされたオブジェクトへの全ての参照が無くなっていることを保証します。これは内部オプションであり、`-ddebug-gc' によって自動的にオンになります。デフォルト: #f

debug-lexer bool

bool#t なら、Flex 文法解析ソフトウェアをデバッグします。デフォルト: #f

debug-page-breaking-scoring bool

bool#t なら、多くの改ページ設定に関するスコアを吐き出します。デフォルト: #f

debug-parser bool

bool#t なら、Bison パーサをデバッグします。デフォルト: #f

debug-property-callbacks bool

bool#t なら、コールバック循環をデバッグします。デフォルト: #f

debug-skylines bool

bool#t なら、スカイライン (訳注: 行ごとのオブジェクトの最高位置と最低位置を線で表示するもの) を表示します。デフォルト: #f

delete-intermediate-files bool

bool#t なら、コンパイルの途中で作成される使用しない中間ファイル ‘.ps’ を削除します。デフォルト: #t

dump-signatures bool

bool#t なら、システムごとに出力情報を吐き出します。回帰テストに用いられます。デフォルト: #f

embed-source-code bool

bool#t なら、出力される PDF ドキュメントに LilyPond ソースファイルを埋め込みます。デフォルト: #f

eps-box-padding num

出力される EPS の左端に num mm の余白を追加します。デフォルト: #f (余白追加しないことを意味します)。

font-export-dir string

PostScript ファイルとしてフォントをエクスポートするディレクトリを string に指定します。デフォルト: #f (カレントディレクトリを意味します)。 これは、次に示すように、フォントを埋め込まずに PDF を作成し、後でフォントを Ghostscript で埋め込む場合に便利です。

$ lilypond -dfont-export-dir=fontdir -dgs-never-embed-fonts foo.ly
$ gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite \
     -sOutputFile=foo.embedded.pdf foo.pdf fontdir/*.font.ps

注: font-ps-resdir とは異なり、このメソッドは Ghostscript 9.26 以降で CID フォントを埋め込むことはできません。

注: font-ps-resdir と同様に、 TrueType フォントを埋め込むと文字化けが発生するため、このオプションは TrueType フォントをスキップします。文字化けしないようにするには、gs-never-embed-fonts を使用します。これは、TrueType フォントをその名前に関係なく埋め込みます。

デフォルト: #f (エクスポートしないことを意味します)。

font-ps-resdir string

(string として) ディレクトリを設定して、後でフォントを埋め込むために使用する PostScript リソース ディレクトリのサブセットをビルドします。これは、次に示すように、フォントを埋め込まずに PDF を作成し、後でフォントを Ghostscript で埋め込む場合に便利です。

$ lilypond -dfont-ps-resdir=resdir -dgs-never-embed-fonts foo.ly
$ gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite \
     -I resdir -I resdir/Font \
     -sOutputFile=foo.embedded.pdf foo.pdf

注: Ghostscript の -I オプションで指定した場合、特別な意味があるため、 ‘Resource’ という名前を含むディレクトリは指定しない方がよいでしょう。

注: font-export-dir とは異なり、このメソッドは Ghostscript 9.26 以降で CID フォントを埋め込むことができます。

注: font-export-dir と同様に、 TrueType フォントを埋め込むと文字化けが発生するため、このオプションは TrueType フォントをスキップします。文字化けしないようにするには、gs-never-embed-fonts を使用します。これは、TrueType フォントをその名前に関係なく埋め込みます。

デフォルト: #f (ビルドしないことを意味します)。

gs-load-fonts bool

bool#t なら、Ghostscript 経由でフォントを読み込みます。LilyPond 出力ファイルのフォントはすべて参照のみが含まれるようになり、 Ghostscript による後処理で実際のフォントに解決する必要があります。デフォルト: #f

gs-load-lily-fonts bool

bool#t なら、LilyPond のフォントを Ghostscript 経由で読み込みます。LilyPond 出力ファイルの音楽フォントはすべて参照のみが含まれるようになり、 Ghostscript による後処理で実際のフォントに解決する必要があります。他のすべてのフォントは通常通り出力されます。デフォルト: #f

gs-never-embed-fonts bool

bool#t なら、Ghostscript が TrueType フォントのみを埋め込むようになり、他のフォーマットのフォントは埋め込まれません。デフォルト: #f

gui bool

bool#t なら、出力を表示せずに処理を行い、すべての出力をログ ファイルにリダイレクトします。デフォルト: #f

Windows ユーザへの注意:lilypond.exe’ がデフォルトですべての進捗情報をコマンド ウィンドウに出力するのに対して、‘lilypond-windows.exe’ は進捗情報を出力しません。‘-dgui’ オプションを用いることで、出力をログ ファイルにリダイレクトさせることができます。

help bool

bool#t なら、このヘルプを表示します。デフォルト: #f

include-book-title-preview bool

bool#t なら、プレビュー画像にブック タイトルを含めます。デフォルト: #t

include-eps-fonts bool

bool#t なら、システム毎の EPS ファイルにフォントを含めます。デフォルト: #t

include-settings string

グローバル設定のファイルとして string をインクルードします。このファイルは楽譜の処理が開始する前にインクルードされます。デフォルト: #f (グローバル設定ファイル無しを意味します)。

job-count num

num ジョブで、並列処理します。デフォルト: #f (並列処理無しを意味します)。

log-file string

出力をログファイル ‘string.log’ にリダイレクトします。デフォルト: #f (ログファイル無しを意味します)。

max-markup-depth num

マークアップ ツリーの階層の最大値を num に設定します。それよりも深い階層を持つマークアップがある場合、そのマークアップは終了していないと見なされて、警告が表示され、null マークアップが返されます。デフォルト: 1024

midi-extension string

MIDI 出力ファイルのデフォルトのファイル拡張子を ‘.string’ に設定します。デフォルト: "midi"

music-strings-to-paths bool

bool#t なら、記譜フォントを用いるテキストをパスに変換します。デフォルト: #f

paper-size extra-quoted-string

デフォルトの紙面サイズを extra-quoted-string に設定します。文字列をエスケープ記号付の 2 重引用符で囲む必要があることに注意してください。デフォルト: "\"a4\""

pixmap-format symbol

画像出力のための GhostScript の出力フォーマットを symbol に設定します。デフォルト: png16m

point-and-click bool

bool#t なら、PDF と SVG 出力に ‘ポイント&クリック’ リンクを付け加えます。ポイント&クリック を参照してください。デフォルト: #f

preview bool

bool#t なら、通常の出力に加えてプレビュー画像を作成します。デフォルト: #f

このオプションはすべてのバックエンド (pdf, png, ps, eps, それに svg) でサポートされますが、scm ではサポートされません。入力ファイル名 file でバックエンド format を使った場合、出力ファイル名は ‘file.preview.format’ で、タイトルと楽譜の最初の段を含みます。 \book ブロックや \bookpart ブロックが使われている場合、\book, \bookpart, それに \score のタイトルが出力に譜刻され、\paper 変数 print-all-headers#t にセットされている場合は各 \score ブロックの最初の段も譜刻されます。

通常の出力を抑制するには、必要に応じて ‘-dprint-pages’ オプションまたは ‘-dno-print-pages’ オプションを使ってください。

print-pages bool

bool#t なら、すべてのページを生成します。デフォルト: #t

-dpreview’ や ‘-dcrop’ を使う場合は ‘-dno-print-pages’ を組み合わせると有用です。

profile-property-accesses bool

bool#t なら、get_property() 関数呼び出しの統計を取ります。デフォルト: #t

protected-scheme-parsing bool

bool#t なら、パーサでインライン Scheme のエラーが発生しても処理を続けます。#f に設定されている場合、エラー終了して、スタック トレースを表示します。デフォルト: #t

read-file-list string

string’ を処理する入力ファイルのリストを保持するファイルとして指定します。デフォルト: #f (入力ファイルのリスト無しを意味します)。

relative-includes bool

bool#t なら、\include コマンドを処理するとき、インクルードするファイルをカレント ファイルからの相対位置で検索します。#f なら、ルート ファイルからからの相対位置で検索します。デフォルト: #f

resolution num

生成する PNG 画像の解像度を num dpi に設定します。デフォルト: 101

safe bool

bool#t なら、‘.ly’ 入力ファイルを信用しません。デフォルト: #f

Web サーバ経由で LilyPond 譜刻が利用可能な場合、‘--dsafe’ オプションか ‘--jail’ オプションのどちらかを 指定する必要があります。‘--dsafe’ オプションはインライン Scheme コードが無茶をする – 例えば、以下のような – ことを防ぎます。

% 正しく書くのはあまりにも危険
#(s ystem "rm -rf /")
% 破壊的ではないが悪意がある
{ c4^$(ly:gulp-file "/etc/passwd") }

-dsafe’ オプションはインライン Scheme 表記を特別なセーフ モジュールの中で評価します。これは GUILE の ‘safe-r5rs’ モジュールに由来しますが、‘scm/safe-lily.scm’ でリスト アップされている LilyPond API 関数のいくつかも追加されています。

さらに、セーフ モードでは \include は許可されず、TeX 文字列の中でバックスラッシュを使うこともできません。また、セーフ モードでは LilyPond 変数を Scheme にインポートすることもできません。

-dsafe’ はリソースの過使用を検出 しません ので、このオプションを指定してもプログラムをハングさせられる可能性があります – 例えば、サイクリック (巡回) データ構造をバックエンドに埋め込むことによってです。 そのため、LilyPond を一般公開する Web サーバで使用する場合、プロセスのCPU とメモリ使用を制限すべきです。

セーフ モードは多くの有用な LilyPond 楽譜断片がコンパイルされることを妨げます。

--jail’ はさらに安全な代替手段ですが、セットアップにかかる手間も増えます。LilyPond の基本的なコマンド ライン オプション を参照してください。

separate-log-files bool

bool#t なら、入力ファイル ‘file1.ly’, ‘file2.ly’, … に対するログをファイル ‘file1.log’, ‘file2.log’, … に出力します。デフォルト: #f

show-available-fonts bool

bool#t なら、使用可能なフォント名をリスト アップします。加えて LilyPond は fontconfig の設定そのものを表示します。デフォルト: #f

strict-infinity-checking bool

bool#t なら、浮動小数点の例外 InfNaN に遭遇した時、強制終了します。デフォルト: #f

strip-output-dir bool

bool#t なら、出力ファイル名を構築する時に入力ファイルのディレクトリを使用しません。デフォルト: #f

strokeadjust bool

bool#t なら、PostScript に線幅補正 (stroke adjustment) を強制します。このオプションは普通、PDF ファイルが PostScript 出力から生成されている場合に意味があります (線幅補正は、低解像度のビットマップ デバイスに対して自動的に有効になります)。このオプションを指定しない場合、PDF ビューアは典型的な解像度のスクリーンにおいて、一貫性の無い符幹の幅を出力しようとします。このオプションは印刷結果の品質には目立って影響せず、PDF のファイル サイズを大きく増加させます。デフォルト: #f

svg-woff bool

このオプションは svg バックエンドで Web Open Format (WOFF) フォントを使うために必要となります。bool#t なら、ページ毎の SVG ファイルが全ページ分作られます。LilyPond 自身の音楽グリフを除き、フォントは埋め込まれません。そのため、テキストや歌詞の最適な描画を得るためには、SVG ビュアーにフォントが必要となります。SVG ビュアーが対応していないことがあるので、‘フォントエイリアス’ や ‘フォントリスト’ を使用しないことをお勧めします。デフォルト: #f

verbose

饒舌レベル。これは読み込み専用のオプションで、設定しても効果はありません。

warning-as-error bool

bool#t なら、すべての警告と ‘プログラミング エラー’ をエラーに変更します。デフォルト: #f


環境変数

lilypond は以下の環境変数を認識します:

LILYPOND_DATADIR

これはデフォルトで参照するロケール メッセージとデータ ファイルがあるディレクトリを指定し、コンパイル時に定義されるか、実行時に動的に計算される場所を上書きします (再配置 を参照してください) 。このディレクトリは ‘ly’, ‘ps’, ‘tex’ などのサブディレクトリを保持しているべきです。

LILYPOND_LOCALEDIR

ロケール固有のファイルが配置されているディレクトリを指定します。これは LILYPOND_DATADIR から派生した値を上書きします。

LILYPOND_RELOCDIR

再配置ファイルが配置されているディレクトリを指定します。これは lilypond バイナリの場所から派生した値を上書きします。

LANG

stdout および stderr に送信される LilyPond データ、たとえば、進捗レポート、警告メッセージ、デバッグ出力などの言語を選択します。例: LANG=de

LILYPOND_LOGLEVEL

デフォルトのログレベル。明示的にログレベルが指定されずに LilyPond が呼び出された場合 (すなわち ‘--loglevel’ コマンド ライン オプションが指定されなかった場合)、この値が使用されます。

LILYPOND_GC_YIELD

メモリ管理を調節する変数 (単位はパーセント) です。大きな値は LilyPond に多くのメモリ使用を許し、小さな値だと CPU 使用時間が長くなります。デフォルト値は 70 です。 この変数を使ってメモリ使用量とパフォーマンスを調節することができます。これはメモリ管理の振る舞いを調整するパーセント値です。高い値にするとプログラムはより多くのメモリを使用し、低い値にするとより多くの CPU 時間を使用します。デフォルト値は 70 です。


再配置

Unix の世界のほとんどのプログラムは、コンパイル前の構成時に決定されるデフォルト ディレクトリを使用します。 LilyPond も例外ではありません。たとえば、標準的なインストールでは、‘lilypond’ バイナリが ‘/usr/bin’ に配置され、LilyPond に固有のすべてのファイルが ‘/usr/share/lilypond/2.21.0/’ のサブディレクトリに配置されます (現在のバージョンが 2.21.0 であると仮定すると) 。

このアプローチは、手動コンパイルや標準のパッケージ マネージャーが付属するプラットフォームでは正常に機能しますが、そのようなマネージャーが一般的でないか、デフォルトで使用されないプラットフォームでは問題を引き起こす可能性があります。このようなプラットフォームの典型的な例は、ユーザーがアプリケーション バンドルをどこにでもインストールできると期待している Windows と MacOS です。

この問題の一般的な解決策は再配置サポートです。データファイルへのハードコーディングされたパスを使用する代わりに、必要なサポートファイルの場所が実行時に実行されたバイナリに対して相対的に計算されます。


再配置ファイル

実行時の構成には、実際には別のメカニズムがあります。 LilyPond は、外部プログラムとライブラリ、特にシステムフォントを見つけるための ‘FontConfig’ 、 Scheme ファイルを処理するための ‘GUILE’ ライブラリ、 PS データを PDF ファイルに変換するための gs プログラムにそれぞれ大きく依存しています。それらのすべては、関連するデータファイルを見つけるためにも構成する必要があります。これを行うために、lilypond プログラムは外部ライブラリとプログラムを制御する環境変数を操作するために、 ‘relocate’ というディレクトリ(存在する場合。下のこのディレクトリが検索される場所を参照してください) 内のすべてのファイルを解析します。このような再配置ファイルのフォーマットは単純です。各行には構文があります

command key=value

空の行は無視されます。

command ディレクティブは次のいずれかです。

set

環境変数 key を無条件に value にセットします。 これは以前に設定された値を上書きします。

set?

key がまだ定義されていない場合にのみ、環境変数 keyvalue にセットします。つまり、以前に設定された値を上書きしません。

setdir

value がディレクトリの場合、無条件に環境変数 keyvalue にセットします。それ以外の場合は、警告を発します。

setfile

value がファイルの場合、無条件に環境変数 keyvalue にセットします。それ以外の場合は、警告を発します。

prependdir

環境変数 key 内のディレクトリのリストにディレクトリ value を追加します。 key が存在しない場合は作成されます。

(先頭のドル記号でマークされた) 環境変数は value で許可され、ディレクティブが実行される前に展開されます。

以下は、GUB から取得した再配置ファイル エントリの 2 つの例です ( Grand Unified Builder (GUB) を参照してください) 。

set? FONTCONFIG_FILE=$INSTALLER_PREFIX/etc/fonts/fonts.conf
prependdir GUILE_LOAD_PATH=$INSTALLER_PREFIX/share/guile/1.8

relocate’ ディレクトリ内のファイルの解析順序は任意であるため、再配置ファイルでは、複数の行で同じ環境変数を設定することを避ける必要があります。


再配置アルゴリズム

LilyPond は、次のアルゴリズムを使用してデータファイルを検索します。

  1. 現在実行されている lilypond バイナリが配置されているディレクトリを計算します。これを bindir としましょう。 (内部) 環境変数 INSTALLER_PREFIX を ‘bindir/..’ (つまり、bindir の親ディレクトリ) にセットします。
  2. 環境変数 LILYPOND_DATADIR を確認します。セットされている場合は、その値を LilyPond のデータ ディレクトリ datadir に使用します。それ以外の場合は、‘$INSTALLER_PREFIX/share/lilypond/version’ (version は現在の LilyPond バージョンです) または ‘$INSTALLER_PREFIX/share/lilypond/current’ を使用します。
  3. 環境変数 LILYPOND_LOCALEDIR を確認します。セットされている場合は、その値を LilyPond のロケール データ ディレクトリ localedir に使用します。それ以外の場合は、‘$INSTALLER_PREFIX/share/locale’ を使用します。
  4. 環境変数 LILYPOND_RELOCDIR を確認します。セットされている場合は、その値を LilyPond の再配置ファイルのディレクトリ relocdir に使用します。それ以外の場合は、‘$INSTALLER_PREFIX/etc/relocate’ を使用します。
  5. datadir が存在しない場合は、代わりにコンパイル時の値を使用します。 localedir についても同様です (ただし、relocdir に関しては無意味なので、同様ではありません) 。
  6. relocdir が存在する場合は、再配置ファイル の説明に従って、このディレクトリ内のすべてのファイルを処理します。

chroot jail 環境で LilyPond を実行する

LilyPond を chroot jail 環境で実行させるようサーバをセットアップすることは複雑な作業です。以下にステップをリスト アップします。各ステップの中にある例は Ubuntu GNU/Linux 用であり、sudo の使用が必要となるかもしれません。

32-bit Ubuntu 8.04 用のスクリプト例

#!/bin/sh
## defaults set here

username=lily
home=/home
loopdevice=/dev/loop0
jaildir=/mnt/lilyloop
# the prefix (without the leading slash!)
lilyprefix=usr/local
# the directory where lilypond is installed on the system
lilydir=/$lilyprefix/lilypond/

userhome=$home/$username
loopfile=$userhome/loopfile
adduser $username
dd if=/dev/zero of=$loopfile bs=1k count=200000
mkdir $jaildir
losetup $loopdevice $loopfile
mkfs -t ext3 $loopdevice 200000
mount -t ext3 $loopdevice $jaildir
mkdir $jaildir/lilyhome
chown $username $jaildir/lilyhome
cd $jaildir

mkdir -p bin usr/bin usr/share usr/lib usr/share/fonts $lilyprefix tmp
chmod a+w tmp

cp -r -L $lilydir $lilyprefix
cp -L /bin/sh /bin/rm bin
cp -L /usr/bin/convert /usr/bin/gs usr/bin
cp -L /usr/share/fonts/truetype usr/share/fonts

# Now the library copying magic
for i in "$lilydir/usr/bin/lilypond" "$lilydir/usr/bin/guile" "/bin/sh"  \
  "/bin/rm" "/usr/bin/gs" "/usr/bin/convert"; do ldd $i | sed 's/.*=>  \
    \/\(.*\/\)\([^(]*\).*/mkdir -p \1 \&\& cp -L \/\1\2 \1\2/' | sed  \
      's/\t\/\(.*\/\)\(.*\) (.*)$/mkdir -p \1 \&\& cp -L \/\1\2 \1\2/'  \
        | sed '/.*=>.*/d'; done | sh -s

# The shared files for Ghostscript...
      cp -L -r /usr/share/ghostscript usr/share
# The shared files for ImageMagick
      cp -L -r /usr/lib/ImageMagick* usr/lib

### Now, assuming that you have test.ly in /mnt/lilyloop/lilyhome,
### you should be able to run:
### Note that /$lilyprefix/bin/lilypond is a script, which sets the
### LD_LIBRARY_PATH - this is crucial
      /$lilyprefix/bin/lilypond -jlily,lily,/mnt/lilyloop,/lilyhome test.ly

脚注

[1] GUILE のステータスは ‘.ly’ 処理後にリセットされません。そのため、Scheme 内部からいかなるシステム デフォルトも変更しないよう注意してください。


LilyPond — 使用方法 v2.21.82 (開発版).