乐谱排版 (MusiXTeX/LilyPond)

数学是 LaTeX 的主场,那么 五线谱乐谱 呢?实际有三条路:在 TeX 内部排版的 MusiXTeX,通过 lilypond-book 引入的独立高质量制谱引擎 LilyPond,以及用 abc 宏包嵌入的轻量 ABC 记谱法。本页说明它们各自的机制,以及该如何选择。

MusiXTeX - 在 TeX 内部制谱

MusiXTeX 是完全由 TeX 宏构成的音乐排版系统。它继承自较早的 MusicTeX,在 TeX 框架内绘制五线谱、符头、连音梁和连线等元素。由于不依赖外部绘图程序,它适合希望 把整个工具链保持在 TeX 内部 的场景。

它的处理流程很有特点。为了优化音符之间的间距,MusiXTeX 以 三遍处理 运行。首先 TeX(实际是 e-TeX)处理一次并写出 .mx1 文件;随附的 Lua 脚本 musixflx 读取它,计算每一拍的间距并生成 .mx2;最后 TeX 再运行一次得到最终输出。名为 musixtex 的包装脚本会替你协调这三次运行,并在需要时调用预处理器(下面的 pmx / M-Tx 前端)。

terminal
musixtex score.tex   # runs e-TeX → musixflx → e-TeX, then makes the PDF

原始的 MusiXTeX 宏公认很难手写,所以几乎没人直接这样做。通常会使用更高层的 前端pmx 是一个预处理器,把简洁得多的输入语言编译成 MusiXTeX 宏。对于带歌词的声乐作品,还会在 pmx 前面使用 M-Tx,形成 M-Tx -> pmx -> MusiXTeX 的分阶段转换。下面是最小的 MusiXTeX 骨架(实际项目中更现实的是编写 pmx 输入)。

document.tex
\input musixtex
\begin{music}
  \instrumentnumber{1}
  \setclef{1}{\treble}
  \startextract
    \Notes \qa{cdef} \en
    \Notes \ha{g} \en
  \endextract
\end{music}
\end

LilyPond 与 lilypond-book - 引入独立引擎

LilyPond 是带有独立输入语言的专用乐谱雕版引擎。它是 TeX 之外的程序,因能生成最高水准的乐谱排版而广为人知。它的输入方式与 MusiXTeX 完全不同,但用平易的记法就能得到同等甚至更精美的结果。把它与 LaTeX 文档结合的标准方法是 lilypond-book

基本思路是:在扩展名为 .lytex 的文件中,把 LaTeX 正文和 LilyPond 片段 混写在一起。短片段放在 \lilypond{...} 中,较长片段放在 lilypond 环境中,外部文件用 \lilypondfile{...} 引入。对它运行 lilypond-book 后,每个片段会由 LilyPond 渲染成图像(或 PDF),并输出一个 普通 .tex 文件,其中这些片段被替换为图形插入命令。之后照常编译,乐谱就会自然融入文档。

document.tex
% --- score.lytex ---
\documentclass{article}
\begin{document}
Here is a short phrase:
\begin{lilypond}[quote,fragment,staffsize=26]
  c'4 d' e' f' g'2 g'
\end{lilypond}
\end{document}

构建分两步。首先对 .lytex 文件运行 lilypond-book(加上 --pdf 可把片段作为 PDF 嵌入),然后用 pdflatex 或类似程序编译生成的 .tex。乐谱的行宽会从导言区读取正文宽度并自动匹配。

terminal
lilypond-book --pdf score.lytex   # renders snippets, writes score.tex
pdflatex score.tex                # compile the generated document

更现代的选择是 lyluatex 宏包。它专为 LuaLaTeX 设计,不经过 lilypond-book 预处理,而是在 编译过程中直接调用 LilyPond 生成并插入乐谱。用 lily 环境或 \lilypond 命令写乐谱,然后以 --shell-escape 启动 lualatex 即可。它被定位为 lilypond-book 的可替换超集。

abc 宏包 - 简便的 ABC 记谱法

abc 宏包 可以把 ABC 记谱法 这种非常紧凑的文本音乐格式嵌入 LaTeX。ABC 首先强调人类易读易写,常用于记录爱尔兰、英格兰、苏格兰等西欧传统的 民歌和主旋律谱(单旋律)

它的机制类似 lilypond-book,依赖外部转换器。写在 abc 环境中的乐谱会由宏包通过 \write18(shell 执行)交给 abcm2ps,渲染成乐谱图像后再插入文档。因为使用 shell 执行,编译时必须加上 -shell-escape。另外还有经典工具 abc2mtex,可把 ASCII ABC 转换为 MusicTeX/MusiXTeX 输入,作为预处理器使用。

document.tex
\documentclass{article}
\usepackage{abc}
\begin{document}
\begin{abc}
X:1
T:Simple Tune
M:4/4
L:1/8
K:C
CDEF|GABc|
\end{abc}
\end{document}
terminal
pdflatex -shell-escape tune.tex   # abc calls abcm2ps via \write18

该选择哪一个

粗略的选择标准如下:如果希望 工具链封闭在 TeX 内部,并在 TeX 内完成复杂制谱,选择 MusiXTeX(实际使用时通常经由 pmx / M-Tx)。如果要排 以质量为第一位的正式乐谱,用 lilypond-book 引入 LilyPond(LuaLaTeX 用户也可用 lyluatex)。如果只是想快速加入 民歌或短小单旋律,则使用 abc 宏包。

方式工作方式适合用途
MusiXTeX由 TeX 宏制谱(三遍处理 + pmx / M-Tx留在 TeX 内;复杂制谱
LilyPond (lilypond-book)外部引擎渲染 -> 插入图像/PDF最高质量的正式乐谱
lyluatexLuaLaTeX 在编译时直接调用 LilyPond在 LuaLaTeX 中轻松使用 LilyPond
abcABC 记谱法由 abcm2ps 转换后嵌入民歌和单旋律主旋律谱

这些工具都在 CTAN 上,并随 TeX Live 等主要发行版提供。LilyPond 本体以及 lilypond-book 有时需要单独安装。请注意,调用外部程序的 abclyluatex 都以允许 shell 执行的 -shell-escape 为前提。