楽譜を作るMusiXTeXの使い方

# musixtex について

ひょんなことからtexlive2022に`musixtex`というのが含まれていることを知りました。楽譜組版用のマクロらしく、数式同様きれいな楽譜を作れる…らしいのですが、あまり広まってないのかQiitaで検索してみても記事がほとんどありませんでした。

そこで今回`musixtex`の使い方を書いてみることにしました。

# ソースコード

例えばこんな楽譜を作りたいとします（きらきらぼしです）。みんなが知ってて譜面のソースコードがそれほど長くなくて普通のピアノの楽譜で右手と左手の譜面が両方あるものであと自分がメロディを覚えている曲だったのでこれにしました。

![musixteximg-nt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/155c970b-9cd6-de13-2808-61714f7e2586.png)


ソースコードはこんな感じです。なお今回はコンパイルすることに焦点を当てているのでソースコードそのものの解説はしません。コードについては[MusiXTeXドキュメント](https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/macros/musixtex/doc/musixdoc.pdf)をご覧ください。

```latex:platex文書
\documentclass[dvipdfmx]{jsarticle}
\usepackage{musixtex}
\pagestyle{empty}
\begin{document}
\nobarnumbers
\nostartrule
\begin{music}
	\parindent10mm
	\instrumentnumber{1}
	\setname1{Piano}
	\setstaffs1{2}
	\setclef16
	\generalmeter{\meterfrac44}
	\startpiece
	\Notes\qa {JJNN}|\qa {ccgg}\en\bar
	\Notes\qa{OO}\ha{N}|\qa{hh}\ha{g}\en\bar
	\Notes\qa{MMLL}|\qa{ffee}\en\bar
	\Notes\qa{KK}\ha{J}|\qa{dd}\ha{c}\en\setrightrepeat\bar
	\Notes\qa{NNMM}|\qa{ggff}\en\bar
	\Notes\qa{LL}\ha{K}|\qa{ee}\ha{d}\en\bar
	\Notes\qa{NNMM}|\qa{ggff}\en\bar
	\Notes\qa{LL}\ha{K}|\qa{ee}\ha{d}\en\bar
	\Notes\qa{JJNN}|\qa {ccgg}\en\bar
	\Notes\qa{OO}\ha{N}|\qa{hh}\ha{g}\en\bar
	\Notes\qa{MMLL}|\qa{ffee}\en\bar
	\Notes\qa{KK}\ha{J}|\qa{dd}\ha{c}\en\setrightrepeat
	\endpiece
	\end{music}
\end{document}
```

# コンパイルレシピ

`hoge.tex`を`hoge.pdf`にするレシピは次のようなものです。

![musixtexchart1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/c57eba30-1952-3229-08ee-9c6d4502d72a.png)


普通に platex+dvipdfmx をかけるとレイアウトが悲惨なことになります。

![musixteximg-nt-mechakucha.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823185/2cafbfd4-a752-f61f-dbbe-195c80b3e8a1.png)


これを回避するために`mx2ファイル`を参照してコンパイルするのです。さらなる注意点として`mx2ファイル`は次のコンパイル前に削除しないと正しいレイアウトになりません。正確には、行数が増えたときにその内容が反映されません。

以上を踏まえたLaTeX-Workshopの設定はこんな感じです。


```json:settings.json
{
	"latex-workshop.latex.recipes": [
		{
			"name": "pmusixlatexmk",
			"tools": [
				"platex",
				"musixflx",
				"platexmk",
			]
		},
        {
			"name": "pmusixlatex",
			"tools": [
				"platex",
				"musixflx",
				"platex",
                "dvipdfmx"

			]
		},

	],
	"latex-workshop.latex.tools": [
		{
			"name": "platexmk",
			"command": "latexmk",
			"args": [
				"-e",
				"$latex=q/platex -synctex=1 -interaction=nonstopmode -halt-on-error/",
				"-e",
				"$bibtex=q/pbibtex/",
				"-e",
				"$biber=q/biber --bblencoding=utf8 -u -U --output_safechars/",
				"-e",
				"$dvipdf=q/dvipdfmx %O -o %D %S/",
				"-e",
				"$makeindex=q/mendex %O -o %D %S/",
				"%DOC%",
				"-e",
				"$ENV{'TEXINPUTS'}='.//:' . $ENV{'TEXINPUTS'}"
			]
		},
		{
			"name": "platex",
			"command": "platex",
			"args": [
				"-interaction=nonstopmode",
				"-synctex=1",
				"-halt-on-error",
				"-file-line-error",
				"%DOCFILE%.tex",
			],
		},
		{
			"name": "musixflx",
			"command": "musixflx",
			"args": [
				"%DOCFILE%.mx1",
			],
		},
        {
			"name": "dvipdfmx",
			"command": "dvipdfmx",
			"args": [
				"%DOCFILE%.dvi",
			],
		},

		],
	"latex-workshop.latex.autoClean.run": "onBuilt",
	"latex-workshop.latex.clean.fileTypes": [
		"*.aux",
		"*.out",
		"*.toc",
		"*.fls",
		"*.log",
		"*.fdb_latexmk",
		"*.synctex(busy)",
		"*.synctex.gz(busy)",
		"*.mx1",
		"*.mx2",
		"*.dvi",
		"*.txt"
	],
}
```

`pmusixlatexmk`では目次と日本語付きの楽譜が作れるように、platex → musixflx → latexmk としています。dvipdfmx はlatexmk の中でやってくれます。一方`pmusixlatex`では普通に platex → musixflx → platex → dvipdfmx としています。あと必ず`mx2`ファイルを削除してくれるように`latex-workshop.latex.clean.fileTypes`のリストに加えています。

これでコンパイルすると冒頭の楽譜を得ることができます。

# 参考文献

https://tex.stackexchange.com/questions/260724/latexmk-and-musixtex-or-adding-commands-to-latexmk-workflow

[MusiXTeXドキュメント](https://ftp.yz.yamagata-u.ac.jp/pub/CTAN/macros/musixtex/doc/musixdoc.pdf)