Skip to content
Go back

Markdownの強調記法の仕様

Markdownの標準的な仕様であるCommonMarkの区切り列(delimiter run)に関する記述を簡単にまとめます。

  • delimiter runはエスケープされていない記号の集まりで、開く側に対応するleft-flankingと閉じる側に対応するright-flankingがある
    • 左右両方に解釈されるdelimiter runも書けるが、最終的には開閉どちらか一方のみに対応する
  • delimiter runは直前・直後の文字で以下を満たす必要がある:
    1. 内側が”空白”でない
    2. または、
      • a) 内側が”約物”でない
      • b) または、内側が”約物”で、外側が”空白”か”約物”である
    • ここでの”空白”はUnicodeのZsカテゴリとTab(U+0009)、Line Feed(U+000A)、Form Feed(U+000C)、Carriage Return(U+000D)のこと
    • ここでの”約物”はUnicodeにおけるPカテゴリとSカテゴリのことで、句読点・括弧類・記号類などを含む
  • 左右のdelimiter runに挟まれた文字列は強調表示される
    • 記号が_の場合には、追加ルールがいくつかある

ルビ記法を例に考えると、**|これ《kore》**は”約物”()がすぐ内側にあるので、そのすぐ外側に”空白”か”約物”がないとdelimiter runとして解釈されません。ただ、実装がこれに準拠しているかは別の話で、それぞれに以下のような個性があるようです。

  • Obsidianでは
    • 左delimiter runがあるだけでハイライトが付き、右delimiter runか行末まで続く
    • Sカテゴリが”約物”として扱われない(ように見える)
  • VSCodeでは
    • 文字と空白以外がすべて”約物”として扱われる(ように見える)
  • Hugoでは
    • (おそらく)仕様に準拠している

これらを踏まえると、日本語を(実質的に)分かち書きせずに強調表示させるには、**の外側をThin Space(U+2009)かHair Space(U+200A)で区切るというのが良いでしょうか。ゼロ幅スペース(U+200B)を使う手もありますが、これは本当に”ゼロ幅”なので、有るのか無いのかを見た目で判断できません。その点、Thin SpaceとHair Spaceは幅があるので、(視認しづらさはあれど)見た目で判断できます。また、ゼロ幅スペースは”空白”でも”約物”でもないので、実装によって扱われ方に差異がある可能性があります。

実例

Thin Spaceは なんとなくわかるくらいの幅 がある。

Hair Spaceは ほとんど分からないくらいの幅 しかない。

Zero Width Spaceは​見た目にはまったく分からない​がちゃんとある。

参考資料