Markdownの標準的な仕様であるCommonMarkの区切り列(delimiter run)に関する記述を簡単にまとめます。
- delimiter runはエスケープされていない記号の集まりで、開く側に対応するleft-flankingと閉じる側に対応するright-flankingがある
- 左右両方に解釈されるdelimiter runも書けるが、最終的には開閉どちらか一方のみに対応する
- delimiter runは直前・直後の文字で以下を満たす必要がある:
- 内側が”空白”でない
- または、
- 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は見た目にはまったく分からないがちゃんとある。