Corredor

ウェブ、プログラミングの勉強メモ。

Markdown の強調構文で使う「アスタリスク」と「アンダースコア」の違い

Markdown 記法の中で強調するための記号には2種類ある。アスタリスク * とアンダースコア _ だ。

**これで強調される**

__これでも強調される__

これらの2つの違いと、なぜ2つあるのか、というところを調べてみた。

アスタリスクとアンダースコアの違い

アスタリスクで強調した時とアンダースコアで強調した時の違いは、「分かち書きが必要かどうか」にある。

「分かち書き」とは、スペースで単語を区切る、通常の英文章の書かれ方のこと。日本語の場合、普段スペースで単語を区切ることはないので、「分かち書きがない文章」ということになる。

アスタリスク * を使った時は、「英単語中の特定の文字だけ」とか、「スペース区切りがない通常の日本語文中の一部だけ」を強調できる。

これは**強調**できる  ← 「強調」の2文字が太字になる
Mar**k**down          ← 一単語中の「k」だけ太字になる

一方、アンダースコア _ の方は、分かち書きをしないと強調構文と見なされないのだ。

これは__強調__できない  ← 「__強調__」と表示され、太字にはならない
Mar__k__down            ← 「Mar__k__down」と表示され、太字にはならない

もし日本語文中でアンダースコアを使って強調したい時は、強調したい箇所をスペースで区切る必要がある。

これは __強調__ できなる  ← 前後にスペースを入れたので「強調」が太字になる

「別にアンダースコアでも強調できるけど?」という場合

ここまで聞いて、「あれ?自分が普段使っているエディタ・ブログでは分かち書きせずにアンダースコアを使っても強調できるけど?」と思った人もいるかもしれない。実はこのへんは、Markdown のパーサの実装によって違いがあるのだ。

自分が普段使っているサービス等で、分かち書きせずにアンダースコアで強調できる Markdown パーサを採用しているのは以下あたり。

  • marked.js … JavaScript 製の Markdown パーサ
  • GitBook
  • はてなブログ … 僕がこのブログを書く時は、強調構文は全てアンダースコア _ を使って書いている。

逆に、アンダースコアを使う時は分かち書きが必要になるのは以下あたり。

この辺の違いの詳細は、以下の記事などが参考になる。

このような違いが生まれているのはなぜだろうか。

「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 の仕様に準拠しているパーサは、アンダースコアは分かち書きが必要になっていて、これに準拠していないパーサは分かち書きしなくても強調できる、という作りなのだ。

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 の仕様に準拠していないこともあり、日本語圏は特に分かち書きしないので、分かち書きなしのアンダースコア強調ができる場所もある。

僕は、アスタリスクで書くよりもアンダースコアを使う方が、文字がごちゃつかなくて好んでいるのだが、今のところ標準外の書き方であることに注意しないと。

もしもはてなブログが「パーサの仕様を標準に揃えました」と言い出したら、僕のブログにはあちこちにアンダースコアが表面化することになるワケだ。w

できたらアンダースコアも分かち書きなしの仕様に統一してほしいなぁ〜。

その他参考

はじめてのMarkdown―軽量マークアップ言語の記法と使い方 (I・O BOOKS)

はじめてのMarkdown―軽量マークアップ言語の記法と使い方 (I・O BOOKS)

最速の仕事術はプログラマーが知っている

最速の仕事術はプログラマーが知っている