MDI 構文リファレンス
MDI 固有の記法を一覧で確認するためのリファレンスである。規範的な仕様はリポジトリの SYNTAX.md とする。記載に差異がある場合は、SYNTAX.md を優先する。
クイックリファレンス
Section titled “クイックリファレンス”| 機能 | 推奨記法 | 意味 |
|---|---|---|
| フロントマター | --- で囲む YAML | 文書メタデータと書字方向 |
| ルビ | {base|reading} | 親文字に読みを付ける |
| 縦中横 | ^12^ | 縦書き内の短い横組み |
| 傍点 | [[em:text]] | 圏点による強調。[[em:<mark>:text]] で記号を指定 |
| 改行抑止 | [[no-break:text]] | 句の途中で改行させない |
| 改行 | [[br]] | 段落内の明示的な改行 |
| 空白段落 | \(単独の行) | 意図的な空段落を1つ |
| 割注 | [[warichu:text]] | 行内二行組の注記 |
| 字間調整 | [[kern:-0.1em:text]] | 明示的な字間の調整 |
| ブロック指定 | [[indent:N]] / [[bottom]] / [[bottom:N]] | 字下げ、または地付き |
| 改ページ | [[pagebreak]] / [[pagebreak:left|right]] | ページ境界を強制する |
| 脚注 | [^id] / [^id]: text(GFM) | 注記の参照と定義 |
| エスケープ | \{ \} | \^ \[ \] \: \《 \》 | 区切り文字をリテラルにする |
1. フロントマター
Section titled “1. フロントマター”ファイル先頭の --- で囲まれた YAML ブロックです。writing-mode(既定 horizontal)は文書全体の書字方向を決め、縦中横・傍点・脚注の描画に影響するため CSS ではなく文書の属性として扱われます。mdi キーは対象バージョンを宣言します。省略時はパーサーの最新対応バージョン扱いになり、対応より新しいバージョンが宣言されると mdi.version.unsupported 警告が出ますが、解析自体は拒否されません(診断参照)。
---mdi: "2.0"title: 雪女author: 小泉八雲lang: jawriting-mode: verticalpage-progression: rtl---renderHtml は lang・title・writing-mode をフロントマターから読み、writing-mode: vertical のときだけ <html> に style="writing-mode: vertical-rl;" を追加します。よくある間違い: 閉じの --- を忘れると、フロントマターではなく通常の Markdown(水平線+段落)として解析されます。
{base|reading}。読み側に . を入れると親文字の書記素クラスタごとに個別の読みを割り当てる分割ルビ({東京|とう.きょう})、. がなければ全体に1つの読みを付けるグループルビ({東京|とうきょう})になります。
私は{雪女|ゆき.おんな}を見た。<ruby class="mdi-ruby">雪<rp>(</rp><rt>ゆき</rt><rp>)</rp>女<rp>(</rp><rt>おんな</rt><rp>)</rp></ruby>よくある間違い: 分割ドットの区切り数が親文字の書記素クラスタ数(𠮟 のようなサロゲートペア漢字も1文字として数える)と一致しない、または空セグメントがある場合は、ドットを外したグループルビへ自動的にフォールバックします ―― プレーンテキストになるわけではありません。GFM の表セル内でルビの | を書くには \| とエスケープします(表解析が MDI より先に \| を処理するため、結果として通常のルビになります)。ベースと読みの両方ともプレーンテキストで、入れ子の構文は認識されません。
3. 縦中横
Section titled “3. 縦中横”^text^。中身は [0-9A-Za-z!?]{1,6} に一致する必要があります ―― 半角英数字と !/?、1〜6文字。
第^12^話。令和^7^年のことである。<span class="mdi-tcy">12</span>.mdi-tcy { text-combine-upright: all; } は縦書きコンテナ内でのみ効果を持つため、横書きでは同じマークアップのまま自然に不活性化します(再解析は不要)。よくある間違い: (^_^) のような文字列に反応すると思いがちですが、文字種制限により対象外でキャレットはリテラルのまま残ります。Pandoc の ^text^(上付き文字)とは無関係で、MDI では常に縦中横です。
推奨: `text(既定の記号 ﹅)または :text(は任意の1文字)。互換記法:text`(カクヨム記法、常に既定記号)。
彼は[[em:それ]]を見た。[[em:●:決して]]忘れない。<span class="mdi-em" style="--mdi-em:"﹅";">それ</span>よくある間違い: `dotのように最初の:の前が1文字でない、または後ろにもう一つ:がない場合、記号指定とはみなされず全体が既定記号のテキストになります(例:ab:cd は「ab:cd」に既定記号)。《《雪》考》のように《/》 を含む別名記法は**完全にリテラル**になります(書名号の入れ子を守るため)。ブラケットマクロの内容として、ルビや縦中横などの MDI インライン構文を入れ子にできます(…` の中身は除く。そちらはプレーンテキストです)。
:::caution[現在の実装状況]
SYNTAX.md は text-emphasis-position: over right と -webkit-text-emphasis、ネストされたルビへの記号重複を防ぐ .mdi-em rt { text-emphasis: none; } を規定しています。@illusions-lab/mdi-to-hast(このサイト自身が使用)のスタイルシートはこれに正確に一致しますが、mdi-core 自身の renderHtml に埋め込まれたスタイルシート(CLI の --to html が使うもの)は現在これらの宣言を含まない簡略版です。HTML の要素構造自体は同一です。詳細は Ecosystem: 移行と互換性 を参照してください。
:::
5. 改行抑止
Section titled “5. 改行抑止”`text` ―― 固有名詞や熟語が行末で分割されないようにします。
[[no-break:東京都新宿区]]に住んでいます。<span class="mdi-nobr">東京都新宿区</span>よくある間違い: 中身が空([[no-break:]])の場合は認識されず、ブラケットごとリテラルテキストになります。
6. 明示的な改行(改行マーカー)と換段
Section titled “6. 明示的な改行(改行マーカー)と換段”[[br]] は段落内で改行しつつ同じ <p> に留まります。CommonMark の空行は新しい段落を開始します ―― MDI 独自の換段マーカーはありません。
春は曙。[[br]]やうやう白くなりゆく山ぎは。
夏は夜。よくある間違い: 昔ながらの行末2スペースのハードブレークも引き続き有効ですが、コピペや編集で失われやすいため [[br]] が推奨されます。ルビ構文 {base|ruby} の中やコードブロック・インラインコード内では [[br]] はリテラル文字列として保持されます。
7. 空白段落
Section titled “7. 空白段落”\ だけの行(^\\[ \t]*$ に一致)が空白段落1つになります。これは常にブロック境界で、直前に空行がなくても段落を終了させます。N行連続すればN個の空段落になります。
春は曙。\\\夏は夜。<p class="mdi-blank"></p>よくある間違い: .md ファイルでは単独の \ はリテラルなバックスラッシュとして描画されます ―― この意味づけは MDI 固有です。<br>/<br /> 単独行や旧来の [[blank]] は互換記法で、保存時に \ へ正規化されます。
:::caution[現在の実装状況]
SYNTAX.md は .mdi-blank に論理プロパティ min-block-size: 1lh を指定していますが、mdi-core の renderHtml に埋め込まれたスタイルシートは物理プロパティ min-height: 1em を使っています。横書きでは見た目の差はわずかですが、縦書きでは正しい論理軸に対応しません。詳細は移行と互換性を参照してください。
:::
`text` ―― 行内に二行組の小さな注記を挿入します。
その日は大安[[warichu:六曜の一つで吉日とされる]]であった。<span class="mdi-warichu">六曜の一つで吉日とされる</span>CSS にネイティブな割注表現はなく、display: inline-block による二行折り返しで近似します(SYNTAX.md 規定)。InDesign など割注をネイティブに持つ出力先では直接マッピングすべきです。
:::caution[現在の実装状況]
mdi-core の renderHtml に埋め込まれたスタイルシートは現在 font-size: .6em のみで、SYNTAX.md/mdi-to-hast が規定する二行折り返しの近似(display: inline-block ほか)を含みません。マークアップ自体は同じです。
:::
9. 字間調整
Section titled “9. 字間調整”[[kern:<量>:<文字列>]]。<量> は ^[+-]?\d+(\.\d+)?em$ に一致する必要があります。
彼は[[kern:-0.1em:確実]]にそう言った。<span class="mdi-kern" style="--mdi-kern:-0.1em;">確実</span>よくある間違い: [[kern:0.1:text]](単位 em を忘れる)のように量が無効な場合、傍点と異なりマクロ全体がリテラルテキストにフォールバックします ―― 字間調整には「引数なし」の意味のある形が存在しないためです。
10. ブロック指定(字下げ・地付き)
Section titled “10. ブロック指定(字下げ・地付き)”対象段落の直前に単独行として書きます。[[indent:N]](N字下げ、全行)、[[bottom]](地付き)、[[bottom:N]](地からN字上げ)。マクロは直後の1ブロックにのみ適用され、重ね掛けはできません。
[[indent:2]]我輩は猫である。名前はまだ無い。
[[bottom]]著者識<p class="mdi-indent" style="--mdi-indent:2;">我輩は猫である。名前はまだ無い。</p>よくある間違い: N が0・負数・非整数、または直後に段落が続かない場合はリテラルテキストです。空白段落の \ 行と同様、ブロック指定マクロの行は常にブロック境界です。
11. 改ページ(改ページ)
Section titled “11. 改ページ(改ページ)”単独行のブロックとして: [[pagebreak]]、[[pagebreak:right]](改丁・次を右丁に)、[[pagebreak:left]](改丁・次を左丁に)。
第一章はここで終わる。
[[pagebreak]]
第二章が始まる。render_epub_document は pagebreak ノードごとに新しい EPUB 章ファイルを開始し、render_docx_document はネイティブな OOXML の改ページ(<w:br w:type="page"/>)を出力します。recto/verso の CSS サポートは限定的なため、EPUB/DOCX エクスポータは各形式のネイティブな改ページ属性へマッピングします。
12. 脚注(脚注)
Section titled “12. 脚注(脚注)”GFM/Pandoc の脚注記法をそのまま継承します。MDI 独自の記法はありません。
彼はその話を信じなかった[^1]。
[^1]: 後に事実と判明する。横書き・縦書きとも現在は文書末の脚注(エンドノート)として描画されます。SYNTAX.md は縦書きレンダラーが傍注(マージンノート)を選択肢として提供してもよい(MAY)としていますが、必須ではありません。
13. エスケープ(エスケープ)
Section titled “13. エスケープ(エスケープ)”\ を { } | ^ [ ] : 《 》 の前に置くと、その文字はリテラルになります。エスケープ処理はすべての MDI インライン解析に先立って一度だけ実行されます。
\{東京\|とうきょう\} \^12\^ \[\[br\]\] \《《文字\》》→ {東京|とうきょう} ^12^ [[br]] 《《文字》》
よくある間違い: GFM の表セル内では \| は MDI のエスケープより前に、GFM 自身の表解析が消費します。結果生じる | は通常の文字として MDI インライン解析に参加するため、セル内のルビの中にリテラルな | を書くことはできません ―― 表の外に出すか、ルビの構成を変えてください。
ブロック段階: (1) フロントマター、(2) 標準 Markdown のブロック構造、(3) 空白段落行(\、<br>、[[blank]])、(4) ブロックマクロ([[pagebreak]]、[[indent:N]]、[[bottom]]、[[bottom:N]])。
インライン段階(各段落の内部): (5) エスケープ処理、(6) ルビ、(7) 《《...》》 傍点別名、(8) 縦中横、(9) ブラケットマクロ([[br]]、`…、…、…、[[kern:…:…]]`)、(10) 脚注参照。
インラインの入れ子
Section titled “インラインの入れ子”ブラケットマクロの内容は MDI インライン内容として解析されます。[[ / ]] の対はカウントで入れ子になり、エスケープされた括弧は数えません(`foobarbazは最初の]]がno-breakを、次がem を閉じます)。ルビ・縦中横・…の内容はプレーンテキストです。HTML 出力は対応する要素をそのまま入れ子にし、傍点がルビを包む場合は.mdi-em rt { text-emphasis: none; }` で読み仮名側の記号重複を抑止します。
TXT 書き出しフレーバー
Section titled “TXT 書き出しフレーバー”render_text_format(Rust)と CLI の --to <flavor> は5種類のフレーバーを実装します。
| フレーバー | ルビ | 傍点 | 備考 |
|---|---|---|---|
txt(プレーン) | 破棄 ―― 親文字のみ | 破棄 | 最も単純な書き出し |
txt-ruby | {base|reading} 形式で保持 | プレーンテキスト(記号は破棄) | 後で再構築できる程度に保持 |
narou | |base《reading》 | 一字ずつの圏点ルビ(サイトに傍点記法がないため) | 小説家になろうの投稿フォーマット |
kakuyomu | |base《reading》 | ネイティブな 《《text》》 記法 | カクヨムの投稿フォーマット。narou との違いは傍点の行のみ |
aozora | base《reading》 | text[#「text」に傍点] | 青空文庫の注記慣例。CLI が Shift_JIS へ再エンコード |
各フレーバーに対応する慣例がない構成要素は、マクロを除去し中身のテキストだけを残します。完全な対応表は CLI ページ と SYNTAX.md の TXT Export Flavors 節を参照してください。
次のステップ
Section titled “次のステップ”- ライブ・ショーケース — 記法の表示例を確認する。
- ドキュメント IR — 解析結果の構造を確認する。
- 互換性と移行 — 仕様と実装の差異を確認する。