
2026/01/21 22:08
```markdown # Nested Code Fences in Markdown Markdown ではコードブロックを入れ子にすることができます。 主な記述方法は次のとおりです。 ## 基本構文 ``` <外側の fence> <内側の fence> // コード </内側の fence> </外側の fence> ``` ### 具体例 ```diff + これは外側のコードブロックです。 ```python print("内側のコード") ``` - これも外側のコードブロックです。 ``` ## ポイント * **fence の長さ** - 外側と内側で同じ文字(```)を使う場合、内側はより多くの記号(例:4個以上)で囲むと安全です。 - 外側が `~~~` の場合は、内側も `~~~` を使用し、必要なら長めにします。 * **インデント** - 内側のコードブロックを外側からスペース 4つ程度でインデントすると読みやすくなります。 * **エスケープ文字** - コード内に同じ fence の文字が現れた場合、バックスラッシュ `\` を付けてエスケープします。 ## 補足 - GitHub Flavored Markdown(GFM)や多くの Markdown エンジンは上記構文をサポートしています。 - 一部古いレンダラーでは入れ子が正しく解釈されないことがありますので、テストして確認してください。 ``` これで「Nested code fences in Markdown」に関する情報が整理された形になりました。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改善された要約
この記事では、GitHub の Markdown 実装が fenced code blocks(区切り付きコードブロック)と inline code spans(インラインコードスパン)の規則について CommonMark バージョン 0.30 に従っていることを説明し、GitHub Flavored Markdown(GFM)がこれらのルールの厳密なスーパーセットであると指摘しています。
fenced code blocks
fenced code blocks では、フェンスは少なくとも三つ以上のバッククォートまたはチルダで構成される必要があります。閉じフェンスは同一タイプであり、開きフェンスより長くてもよいと述べています。また、チルダとバッククォートを混在させてはいけないこと、および内側に三つのバッククォートが続く場合、外側のフェンスが別の区切り文字(例:
~~~ や ~~~~~)でなければブロックが早期終了してしまうことを明確化しています。記事では正しいフェンス使用と誤ったフェンス使用の例を示しています。
inline code spans
inline code spans では、バッククォート区切り文字の使用方法について説明しています:単一のバッククォート列が同じ長さで開始および終了します。スパン内にバッククォートが含まれる場合は、複数のバッククォート(とスペース)でスパンを開始し、早期終了を避ける必要があります。また、インラインコードスパンの先頭と末尾にあるスペースは 両側とも単一スペースの場合のみ 削除され、行末文字がスパン内に含まれると通常のスペースになります。
結論
GFM は CommonMark の規則を逸脱せずに実装していることを強調し、執筆者やツール開発者は一貫したレンダリングを確保するためにこれらのルールを厳格に遵守すべきだと呼びかけています。
本文
Susam Pal(2026年1月19日)による
今日は、通常はマークダウンのコードフェンス内に住む尖った髪をしたオタク、コリー・ダムと出会います。彼について少し知り、フェンスが閉じた時には笑い、災難が訪れたら静かに涙します。
マークダウン宇宙の注意点の一つは、多種多様な実装が存在することです。同時進行で展開される各宇宙では、マークダウンのレンダリングルールが微妙に異なります。本稿はCommonMark仕様に焦点を当てます。GitHub-Flavored Markdown(GFM)はCommonMarkの厳密な上位互換ですので、議論された内容は両方に同様に適用されます。
目次
- 基本コードフェンス
- ファンキーコードフェンス
- 基本コードスパン
- ファンキーコードスパン
- スペック
基本コードフェンス
コリーは子供の頃からコンピュータを扱う才能がありました。
コリーと彼のコンピュータ:
(o_o)--.|[_]|
コリーの世界では全てが完璧です。CommonMarkレンダラーは上記マークダウンを以下のHTMLに変換します:
<p>Corey at his computer:</p> <pre><code>(o_o)--.|[_]| </code></pre>
この時点では全てが順調です。コリーは急速に成長し、やがて尖った髪の毛を生やしました。その後フェンスが重要になってきます。
大人になったコリー:
(o_o)--.|[_]|
Markdown → HTML の変換で彼の髪が消えてしまいます。視聴者は次のシーンに不快感を覚えるかもしれませんので、閲覧注意です。 レンダリング後のHTML: ```html <p>Corey, all grown up:</p> <pre><code></code></pre> <p>(o_o)--.|[_]|</p> <pre><code></code></pre>
コリーの髪は消えてしまいました! なぜこんなことになるのでしょうか? 2番目の三重バッククォートが最初に始めたフェンスコードブロックを直ちに終了させるため、彼のスマイリーフェイスはフェンス外に出てしまいます。幸いにもCommonMarkにはこのような事故を回避する方法がいくつかあります。
ファンキーコードフェンス
CommonMarkでは、フェンスコードブロック内に三重バッククォートを含める主な手段が2つあります。まずはチルダ(~)をコードフェンスとして使用します:
~~~
(o_o)--.|[_]|
``` コードフェンスは必ずしも正確に3個のバッククォートまたはチルダである必要はありません。≥ 3個あれば何でも構いません。以下は同等です: ```
(o_o)--.|[_]| ~~~~~
および
``` (o_o)--.|[_]| ````` これらの3例はいずれも次のようにレンダリングされます: **大人になったコリー:** ``` ``` (o_o)--.|[_]| ``` 翻訳時に髪は失われません。 ### 基本コードスパン インラインコードスパンでも同様の問題が発生します。多くのマークダウンユーザーはバッククォートでインラインコードスパンを区切る方法を知っています。例: > An old picture of Corey at his computer: `(o_o)--.|[_]|` これは次のような出力になります: ```html <p>An old picture of Corey at his computer: <code>(o_o)--.|[_]|</code></p> ``` しかし、コリーのお気に入りの友人ベッキー・トレースをインラインコードスパン内に入れたい場合はどうしますか? ベッキーは顔の両側に整った短いストレートヘアをしています。彼女の画像はこちらです: > `(o_o)` インラインコードスパンはバッククォートで区切られるため、ベッキーの顔の最初のバッククォートが即座にコードスパンを終了してしまいます。 ### ファンキーコードスパン インラインコードスパンのデリミタは必ずしも1個のバッククォートである必要はありません。任意の数でも構いません。したがって `foo` と ``foo`` は同じHTMLを生成します。もう一つ重要な点として、インラインコードスパン内のテキストがスペースで始まり終わる場合、レンダリング前に両端から1文字ずつスペースが削除されます。そのため `foo` と ` foo ` は同等です。 したがって、バッククォートをインラインコードスパン内に入れるには、複数のバッククォートと空白でスパンを開始します: **コリーの友人ベッキー・トレースを紹介:** `` `(o_o)` `` レンダリング結果: ```html <p>Meet Corey's friend Becky Trace: <code>`(o_o)`</code></p> ``` ベッキーの髪は無事です。これが、バッククォートがマークダウンで入れ子になるときに生存する方法です。 ### スペック 以下はCommonMark Spec Version 0.30(4年以上前)の抜粋です。 **セクション 4.5 – フェンスコードブロック** > コードフェンスは、少なくとも3つ以上の連続したバッククォート文字 (`) またはチルダ (~) の列です。チルダとバッククォートを混在させることはできません。 > > コードブロックの内容は、開始された同じタイプ(バッククォートまたはチルダ)で閉じられたコードフェンスまでのすべての後続行です。開くフェンスと同数以上のバッククォートまたはチルダが必要です。 **セクション 6.1 – コードスパン** > バッククォート文字列は、1個以上のバッククォート文字 (`) の列であり、その前後にバッククォートが存在しないものです。 > > コードスパンはバッククォート文字列で開始し、同じ長さのバッククォート文字列で終了します。内容は以下のように正規化されます: > > 1. 行末はスペースに変換されます。 > 2. 結果の文字列が両端にスペースを持ち、かつ全体がスペースだけで構成されていない場合、前後からそれぞれ1つのスペースが削除されます。 これらのマークダウンの些細なトリビアが、将来あなた自身のマークダウンでの困難を解決する手助けとなることを願っています。