Markdown 記法の中で強調するための記号には2種類ある。アスタリスク *
とアンダースコア _
だ。
**これで強調される** __これでも強調される__
これらの2つの違いと、なぜ2つあるのか、というところを調べてみた。
アスタリスクとアンダースコアの違い
アスタリスクで強調した時とアンダースコアで強調した時の違いは、「分かち書きが必要かどうか」にある。
「分かち書き」とは、スペースで単語を区切る、通常の英文章の書かれ方のこと。日本語の場合、普段スペースで単語を区切ることはないので、「分かち書きがない文章」ということになる。
アスタリスク *
を使った時は、「英単語中の特定の文字だけ」とか、「スペース区切りがない通常の日本語文中の一部だけ」を強調できる。
これは**強調**できる ← 「強調」の2文字が太字になる Mar**k**down ← 一単語中の「k」だけ太字になる
一方、アンダースコア _
の方は、分かち書きをしないと強調構文と見なされないのだ。
これは__強調__できない ← 「__強調__」と表示され、太字にはならない Mar__k__down ← 「Mar__k__down」と表示され、太字にはならない
もし日本語文中でアンダースコアを使って強調したい時は、強調したい箇所をスペースで区切る必要がある。
これは __強調__ できなる ← 前後にスペースを入れたので「強調」が太字になる
「別にアンダースコアでも強調できるけど?」という場合
ここまで聞いて、「あれ?自分が普段使っているエディタ・ブログでは分かち書きせずにアンダースコアを使っても強調できるけど?」と思った人もいるかもしれない。実はこのへんは、Markdown のパーサの実装によって違いがあるのだ。
自分が普段使っているサービス等で、分かち書きせずにアンダースコアで強調できる Markdown パーサを採用しているのは以下あたり。
逆に、アンダースコアを使う時は分かち書きが必要になるのは以下あたり。
- 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 の仕様に準拠しているパーサは、アンダースコアは分かち書きが必要になっていて、これに準拠していないパーサは分かち書きしなくても強調できる、という作りなのだ。
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のパーサーで 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
なるオプションがある。優秀。
はじめてのMarkdown―軽量マークアップ言語の記法と使い方 (I・O BOOKS)
- 作者: 清水美樹
- 出版社/メーカー: 工学社
- 発売日: 2014/05/01
- メディア: 単行本
- この商品を含むブログ (1件) を見る
- 作者: 清水亮
- 出版社/メーカー: クロスメディア・パブリッシング(インプレス)
- 発売日: 2015/07/24
- メディア: Kindle版
- この商品を含むブログ (22件) を見る
- ジャンル: 本・雑誌・コミック > ビジネス・経済・就職 > その他
- ショップ: 楽天ブックス
- 価格: 1,598円
最速の仕事術はプログラマーが知っている【電子書籍】[ 清水 亮 ]
- ジャンル: 本・雑誌・コミック > ビジネス・経済・就職 > 就職・転職 > その他
- ショップ: 楽天Kobo電子書籍ストア
- 価格: 1,439円