CommonMark の重要な概念、段落の interrupt とは という記事の最後にこんなことを書いていたことに昨晩気づきました。
そのうち暇を見て、逆のパターンである「他の要素の直後に、段落を書いた場合の挙動」について説明しようと思います。
すっかり忘れてしまっていたのですが、予告(?)をすっぽかすのもアレなので、まとめてみたいと思います。
前回のおさらい
-
CommonMark には段落の interruptという概念がある
-
いくつかの記法は段落に割り込むことができ、空行無しで別の要素を開始できる
-
たとえば、以下の例は段落に箇条書きが割り込む例
段落1です。 * 空行をはさまずに箇条書きを書いても、ここはリストとして認識されます。
他の要素の直後に段落を書く
では、このサンプルの行を入れ替えてみましょう。
* 空行をはさまずに箇条書きを書いても、ここはリストとして認識されます。
段落1です。
これはどう解釈されるでしょうか。Qiita でのレンダリング結果を見てみましょう。
- 空行をはさまずに箇条書きを書いても、ここはリストとして認識されます。
段落1です。
「段落1です。」の部分は新しい段落ではなく、箇条書きの一部としてみなされていますね。これが Markdown の特徴のひとつでもある、lazy continuation です1。Markdown ではリストや引用ブロックを書く際、2行目以降はインデントや引用符を省略しても良いというルールがあります。先ほどの箇条書きの例は
* 空行をはさまずに箇条書きを書いても、ここはリストとして認識されます。
段落1です。
と等価であると認識されているわけです。インデントせずに済むって便利ですね。まさに怠惰だ!
なお、lazy continuation は空行かほかのブロック要素が登場するまで続きます。
この動作は、他のドキュメントからテキストを切り貼りするときに非常に便利です。段落をまるっとコピペして、先頭にリストマーカーや引用符を書くだけでまるごと箇条書きや引用ブロックに仕立てることができます(ただし、空行が登場すると lazy continuation の効果がなくなるのでご注意を)。
lazy continuation ができる記法とできない記法
lazy continuation ができるのは箇条書き(番号なし、番号付き)と引用ブロックのみです。他の記法では対応していません。
* 空行をはさまずに箇条書きを書いても、ここはリストとして認識されます。
段落1です。
1. 空行をはさまずに箇条書きを書いても、ここはリストとして認識されます。
段落1です。
>空行をはさまずに箇条書きを書いても、ここはリストとして認識されます。
段落1です。
CommonMark でいうところの Container Block (他の要素を内包できるブロック要素)で使えるということですね。
まとめ
- Markdown には lazy continuous という概念がある
- 箇条書きと引用ブロックを書く際に、継続行のインデントやマーカーを省略できる仕組み
- 新しい段落のつもりが箇条書きの一部になることがあるのでご注意ください
-
Markdown では単に lazy、CommonMark では lazy continuation (line) と呼ばれています ↩