Pandoc Markdownで青空文庫風のルビ記法を使う

Markdownにはルビのための標準的なマークアップがありません。

HTML出力の場合は直接HTMLのタグを書くという手もありますが、HTMLのrubyタグは正直言って書きやすいものではありません。

```markdown:HTMLで直接マークアップした例
新宿から電車で一本、<ruby>南小谷<rp>（</rp><rt>みなみおたり</rt><rp>）</rp></ruby>駅に降り立った。
中央本線、<ruby>篠ノ井<rp>（</rp><rt>しののい</rt><rp>）</rp></ruby>線、大糸線を経由して4時間あまり。ここは長野県<ruby>小谷<rp>（</rp><rt>おたり</rt><rp>）</rp></ruby>村である。
駅前を流れる川は日本海に注ぐ姫川で、下流では<ruby>翡翠<rp>（</rp><rt>ヒスイ</rt><rp>）</rp></ruby>が採れるという。
```

> 新宿から電車で一本、<ruby>南小谷<rp>（</rp><rt>みなみおたり</rt><rp>）</rp></ruby>駅に降り立った。
> 中央本線、<ruby>篠ノ井<rp>（</rp><rt>しののい</rt><rp>）</rp></ruby>線、大糸線を経由して4時間あまり。ここは長野県<ruby>小谷<rp>（</rp><rt>おたり</rt><rp>）</rp></ruby>村である。
> 駅前を流れる川は日本海に注ぐ姫川で、下流では<ruby>翡翠<rp>（</rp><rt>ヒスイ</rt><rp>）</rp></ruby>が採れるという。

Pandocを使う場合は、自分でPandoc filterを書けば、予め用意されていなくても好きなマークアップを使うことができます。実際、Pandocの公式サイトにはPandoc filterの例としてルビを処理するためのfilterが載っています。

- [Pandoc filters - A filter for ruby text](https://pandoc.org/filters.html#a-filter-for-ruby-text)

```markdown:公式サイトのfilter例の記法
新宿から電車で一本、[みなみおたり](-南小谷)駅に降り立った。
中央本線、[しののい](-篠ノ井)線、大糸線を経由して4時間あまり。ここは長野県[おたり](-小谷)村である。
駅前を流れる川は日本海に注ぐ姫川で、下流では[ヒスイ](-翡翠)が採れるという。
```

このfilterをそのまま使っても良いのですが、読み仮名が先に来るのは少し不自然です。

Markdownの特徴は「プレーンテキストとしてもそれなりに読める」ことなので、プレーンテキストでもそれっぽく読めるルビ記法を使いたいものです。

# 青空文庫風のルビ記法

青空文庫では二重山括弧《にじゅうやまかっこ》を使ってルビを表しています。

- [青空文庫 注記一覧 - その他 - ルビとルビのように付く文字](https://www.aozora.gr.jp/annotation/etc.html#ruby)
- [特殊な表記 - ルビ](https://www.aozora.gr.jp/KOSAKU/MANUAL_2.html#ruby)

```markdown:青空文庫の記法を使った例
新宿から電車で一本、南小谷《みなみおたり》駅に降り立った。
中央本線、｜篠ノ井《しののい》線、大糸線を経由して4時間あまり。ここは長野県｜小谷《おたり》村である。
駅前を流れる川は日本海に注ぐ姫川で、下流では翡翠《ヒスイ》が採れるという。
```

この記法をMarkdownでも使えると良いのではないでしょうか。

というわけで、青空文庫風のルビ記法をHTML/LaTeX用に変換するPandoc filterを作りました。

- <https://github.com/minoki/pandoc-aozora-ruby>

```shell-session:HTML出力の例
$ pandoc --filter pandoc-aozora-ruby-filter -f markdown -t html foo.md
<p>新宿から電車で一本、<ruby>南小谷<rp>《</rp><rt>みなみおたり</rt><rp>》</rp></ruby>駅に降り立った。 中央本線、<ruby>篠ノ井<rp>《</rp><rt>しののい</rt><rp>》</rp></ruby>線、大糸線を経由して4時間あまり。ここは長野県<ruby>小谷<rp>《</rp><rt>おたり</rt><rp>》</rp></ruby>村である。 駅前を流れる川は日本海に注ぐ姫川で、下流では<ruby>翡翠<rp>《</rp><rt>ヒスイ</rt><rp>》</rp></ruby>が採れるという。</p>
```

```shell-session:LaTeX出力の例
$ pandoc --filter pandoc-aozora-ruby-filter -f markdown -t latex foo.md
新宿から電車で一本、\ruby{南小谷}{みなみおたり}駅に降り立った。
中央本線、\ruby{篠ノ井}{しののい}線、大糸線を経由して4時間あまり。ここは長野県\ruby{小谷}{おたり}村である。
駅前を流れる川は日本海に注ぐ姫川で、下流では\ruby{翡翠}{ヒスイ}が採れるという。
```

注意点として、ルビについての細かい指定（グループの指定など）には対応していません（青空文庫の形式に定められていないので）。細かい指定が必要な場合は、直接HTML/LaTeXを書くなり、独自のfilterを書くなりしてください。

また、ルビ対象やルビテキストにMarkdownのマークアップ（強調、上付き、下付きなど）を含めることはできません。（要望があれば対応するかもしれません）

その他の注意事項についてはGitHubを見てください。

現状、インストールにはHaskell環境が必要です。誰かPythonかLuaに移植してくれ〜

# その他

既存のMarkdown方言におけるルビ記法としては、でんでんマークダウンの記法があるようです。

- [電書ちゃんのでんでんマークダウン - でんでんマークダウン](https://conv.denshochan.com/markdown#ruby)

```markdown:でんでんマークダウンの記法を使った例
新宿から電車で一本、{南小谷|みなみおたり}駅に降り立った。
中央本線、{篠ノ井|しののい}線、大糸線を経由して4時間あまり。ここは長野県{小谷|おたり}村である。
駅前を流れる川は日本海に注ぐ姫川で、下流では{翡翠|ヒスイ}が採れるという。
```

Markdownに青空文庫風のルビ記法を実装するものとしては、Parsedown向けのエクステンションが存在するようです。

- [Parsedown 青空文庫ルビ形式extension](https://github.com/noisan/parsedown-rubytext/blob/master/README-Aozora.md)

以下の記事に、各種小説投稿サイトのルビ記法がまとめられています。青空文庫風（二重山括弧）の記法を採用しているところが多いですが、細かい違いがあるようです。

- [各種小説投稿サイトのルビ記法をJavaScriptで実現する](https://qiita.com/8amjp/items/d7c46d9dee0da4d530ef)