Markdown の強調構文で使う「アスタリスク」と「アンダースコア」の違い
Markdown 記法の中で強調するための記号には2種類ある。アスタリスク *
とアンダースコア _
だ。
**これで強調される**
__これでも強調される__
これらの2つの違いと、なぜ2つあるのか、というところを調べてみた。
目次
- アスタリスクとアンダースコアの違い
- 「別にアンダースコアでも強調できるけど?」に対する説明
- 「Markdown の仕様」はどうやって決まっているのか・差異が生まれた理由
- CommonMark が分かち書きしていないアンダースコアを強調しない理由
- まとめ
- その他参考
アスタリスクとアンダースコアの違い
アスタリスクで強調した時とアンダースコアで強調した時の違いは、「分かち書きが必要かどうか」にある。
「分かち書き」とは、スペースで単語を区切る、通常の英文章の書かれ方のこと。日本語の場合、普段スペースで単語を区切ることはないので、「分かち書きがない文章」ということになる。
アスタリスク *
を使った時は、「英単語中の特定の文字だけ」とか、「スペース区切りがない通常の日本語文中の一部だけ」を強調できる。
これは**強調**できる ← 「強調」の2文字が太字になる
Mar**k**down ← 一単語中の「k」だけ太字になる
一方、アンダースコア _
の方は、分かち書きをしないと強調構文と見なされないのだ。
これは__強調__できない ← 「__強調__」と表示され、太字にはならない
Mar__k__down ← 「Mar__k__down」と表示され、太字にはならない
もし日本語文中でアンダースコアを使って強調したい時は、強調したい箇所をスペースで区切る必要がある。
これは __強調__ できる ← 前後にスペースを入れたので「強調」が太字になる
「別にアンダースコアでも強調できるけど?」に対する説明
ここまで聞いて、「あれ?自分が普段使っているエディタ・ブログでは分かち書きせずにアンダースコアを使っても強調できるけど?」と思った人もいるかもしれない。これは、Markdown のパーサの実装によって違いがあるのだ。
自分が普段使っているサービス等で、分かち書きせずにアンダースコアで強調できる Markdown パーサを採用しているのは以下あたり。
- marked.js … JavaScript 製の Markdown パーサ
- GitBook
- はてなブログ … ちなみに、僕がこのブログを書く時は、強調構文は全てアンダースコア
_
を使って書いている。
逆に、アンダースコアを使う時は分かち書きが必要になるのは以下あたり。
- markdown-it … marked.js 同様の JS 製パーサ
- GitHub (GitHub Flavored Markdown (GFM)) … Issue へのコメントなど
- VSCode の Markdown プレビュー画面
この辺の違いの詳細は、以下の記事などが参考になる。
このような違いが生まれているのはなぜだろうか。
「Markdown の仕様」はどうやって決まっているのか・差異が生まれた理由
ところで、Markdown の文法はどこが定めているのだろう。GitHub Flavored Markdown (GFM) といった方言・拡張があったりするのは分かるが、そのベースはどこが作っているのか。
ベースとなる仕様は、CommonMark というプロジェクトで標準化が進められている。
CommonMarkというのはMarkdownの標準化を目指して2014年に立ち上がったプロジェクトです。
GitHubがCommonMarkを採用したというアナウンスがありました。つまり、長らくMarkdownデファクトと考えられてきたGFM: GitHub Flavored Markdownは、いまやCommonMarkのスーパーセットなのです。
Markdown を作った John Gruber (ジョン・グルーバー) 氏のサイトにも仕様が載っているが、コチラの強調構文に関する記述は "You can use whichever style you prefer; the lone restriction is that the same character must be used to open and close an emphasis span."、つまり「どっちでも好きに使ってね (同じ記号で開始・終了を書けばいいよ)」としか書かれていない。
CommonMark はこの最初の発言を基に、具体的な仕様に落とし込んでいっているようだ。ちなみに、John Gruber 氏の本家 Markdown パーサは「分かち書きしなくても強調できる」 が、CommonMark は「分かち書きしないと強調できない」。CommonMark の方が「制限が厳しくなっている」「融通が効かなくなっている」ともいえる。
つまり、CommonMark の仕様に準拠しているパーサは、アンダースコアは分かち書きが必要になっていて、これに準拠していないパーサは分かち書きしなくても強調できる、という作りなのだ。
QiitaやHatena Blogはさすがに日本語ユーザー向けにしっかり対応してますね。
ということなので、分かち書きをしない言語向けのサービスではあえて CommonMark の仕様に沿わない作りになっていると思われる。
CommonMark が分かち書きしていないアンダースコアを強調しない理由
ところで、ジョン・グルーバー氏の本家 Markdown では許容していたのに、CommonMark はどうして、分かち書きしていないアンダースコアを強調してくれないのだろうか。
強調構文に関する仕様は以下に記載されている。
この中で、以下のように触れられている。
Many implementations have also restricted intraword emphasis to the
*
forms, to avoid unwanted emphasis in words containing internal underscores. (It is best practice to put these in code spans, but users often do not.)
意訳すると、
- 多くの実装では、単語内の強調に
*
(アスタリスク) を使うよう制限を入れている。それは、アンダースコアを含む単語を不要に強調しないようにするためだ (「アンダースコアを含む単語」は本来コードスパンで囲むのがベストプラクティスだが、しばしばユーザはそのようにしないため)。
ということになる。
つまり、foo_bar_baz
といった単語を表記する時は、本当はコードスパン (バッククォート) で囲って書くべきなのだが、そうしない利用者がいて、これを強調と捉えられてしまうと困ると考えて、アンダースコアを無効化しているようだ。
まとめ
- そもそもなぜ強調構文にアスタリスクとアンダースコアの2種類があるのかというと、Markdown 作者のジョン・グルーバーがそう決めたから、である。
- Markdown の標準仕様策定を進める CommonMark の仕様上は「アンダースコア
_
は分かち書き必須」、「アスタリスク*
は分かち書き不要」という差異がある。 - パーサによっては CommonMark の仕様に準拠していないこともあり、日本語圏は特に分かち書きしないので、分かち書きなしのアンダースコア強調ができるサービス・ツールもある。
僕は、アスタリスクで書くよりもアンダースコアの方が、文字列がごちゃつかなくてスッキリするし、アスタリスクはリスト記法にも使える記号だから混同しないように、という理由でアンダースコアを好んで使っているのだが、今のところ CommonMark 仕様とは外れた書き方であることに注意しないと。
もしもはてなブログが「パーサの仕様を CommonMark 標準に揃えました」なんて言い出したら、僕のブログにはあちこちにアンダースコアが表面化することになるワケだ。w
日本語圏の人間としては、できたらアンダースコアも分かち書きなしの仕様に統一してほしいなぁ〜。
その他参考
- Markdownのパーサーで PHP でも JavaScript でも同じ結果が欲しい時は、CommonMark に準拠したライブラリだと良いですよ、という話 - TokunagaKazuya.tk
- CommonMark v0.28 のイマイチなところ - Islands in the byte stream
- JekyllのMarkdown設定(2013年11月18日追記) — Genji App Blog … Redcarpet レンダラのオプションに
no_intra_emphasis
なるオプションがある。優秀。