dokodemonjo 始める

どこでもんじょ原稿形式

項目
1
符号化 UTF-8
基礎文法 CommonMark系Markdown
組方向 (既定)
試験中 方向: 縦(プレビューと PDF の骨格)

1. 記法

(* ISO/IEC 14977風EBNF *)

原稿             = [ 前付 ], 本文 ;
前付             = "---", 改行, { 設定, 改行 }, "---", 改行 ;
設定             = キー, 空白, ":", 空白, 値 ;
本文             = { 標準ブロック | 拡張ブロック } ;
標準ブロック     = ? CommonMark系Markdownブロック ? ;

改行             = "\n" | "\r\n" ;
空白             = { " " | "\t" } ;
非空文字列       = ? 1文字以上の改行を含まないUnicode文字列 ? ;
値               = ? 改行を含まないUnicode文字列 ? ;
正整数           = 非零数字, { 数字 } ;
数字             = "0" | 非零数字 ;
非零数字         = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
識別子           = ? 空白・構文区切り文字を含まない1文字以上のUnicode文字列 ? ;

2. Markdown

構造 構文
見出し #######+空白+本文
段落 空行区切り
強調 *文字*
強い強調 **文字**
強調+強い強調 ***文字***
打ち消し ~~文字~~
行内コード `文字`
リンク [表示](URL)
画像 ![代替](URL)
箇条書き - 項目 / * 項目
チェック - [x] 項目 / - [ ] 項目
引用 > 本文
コードブロック 言語 …
パイプ区切り+区切り行
水平線 ---
行内数式 $…$
独立数式 $ 改行 改行 $
見出し          = ( "#" | "##" | "###" | "####" | "#####" | "######" ), " ", 非空文字列 ;
行内数式        = "
quot;, 非空文字列, "
quot; ; 独立数式 = "$", 改行, 非空文字列, 改行, "$" ;

3. フロントマター

キー =
    "題" | "題名"
  | "紙" | "用紙" | "判型"
  | "行送り方向"
  | "方向"
  | "文字サイズ" | "字数" | "本文幅" | "行数"
  | "段組"
  | "第1頁側"
  | "内余白" | "外余白"
  | "左柱" | "右柱"
  | "ノンブル位置"
  | "目次深さ" | "tocDepth"
  | "h1番号様式" | "h2番号様式" | "h3番号様式"
  | "h1前" | "h1後"
  | "段落間糊Pt" | "段落間糊PlusPt" | "段落間糊MinusPt"
  | "コードブロック前空きem" | "コード文字サイズ倍率"
  | "箇条字下げ" | "箇条字下げEm"
  | "分綴" | "分綴言語規則" | "Hyphenopoly"
  | "全角追加" | "全角除外"
  | "二桁数一枡"
  | "超連結認識プロトコル" ;

判型             = 判型名 | ミリ寸法 ;
判型名           = "A3" | "A4" | "A5" | "A6" | "B4" | "B5" | "B6" ;
ミリ寸法         = 正整数, [ "mm" ], ("×" | "x"), 正整数, [ "mm" ] ;
行送り方向       = "長辺" | "短辺" ;
方向             = "横" | "縦" ;
段組             = "1" | "2" ;
第1頁側          = "右" | "左" ;
柱内容           = "なし" | "文書題" | "章題" | "節題" ;
ノンブル位置     = "下中央" | "下小口" | "下のど" | "上中央" | "上小口" | "上のど" | "なし" ;
目次深さ         = "1" | "2" | "3" | "4" | "5" | "6" ;
入切             = "入" | "切" ;
ポイント長さ     = 数値, "pt" ;
エム長さ         = 数値, "em" ;
数値             = [ "-" ], 数字, { 数字 }, [ ".", 数字, { 数字 } ] ;
命令列           = 命令本体, { ( ";" | ";" ), 命令本体 } ;
正規キー 別名 値域
題名
用紙, 判型 判型(向きを含まない)
行送り方向 長辺 / 短辺
方向 / は試験中)
文字サイズ 正数(pt)
字数 正整数
本文幅 正数(mm)
行数 正整数
段組 1 / 2
第1頁側 /
内余白 非負数(mm)
外余白 非負数(mm)
左柱 柱内容
右柱 柱内容
ノンブル位置 下中央 / 下小口 / 下のど / 上中央 / 上小口 / 上のど / なし
目次深さ tocDepth 16
h1番号様式 {h1}を含み得る文字列
h2番号様式 {h1}, {h2}を含み得る文字列
h3番号様式 {h1}, {h2}, {h3}を含み得る文字列
h1前 命令列
h1後 命令列
段落間糊Pt ポイント長さ
段落間糊PlusPt ポイント長さ
段落間糊MinusPt ポイント長さ
コードブロック前空きem エム長さ
コード文字サイズ倍率 正数
箇条字下げ 箇条字下げEm 非負数(em)
分綴 空白区切り分綴語列
分綴言語規則 Hyphenopoly カンマ区切り言語列
全角追加 文字列
全角除外 文字列
二桁数一枡 /
超連結認識プロトコル カンマ/空白区切りスキーム名
第一見出し番号 := 置換("h1番号様式", "{h1}", 第一見出し連番)
第二見出し番号 := 置換(置換("h2番号様式", "{h1}", 第一見出し連番), "{h2}", 第二見出し連番)
第三見出し番号 := 置換(置換(置換("h3番号様式", "{h1}", 第一見出し連番), "{h2}", 第二見出し連番), "{h3}", 第三見出し連番)

見出し前後の手書き命令種 = 既定命令種 ⇒ 既定命令を注入しない
伸行小 ≡ 伸行中 ≡ 伸行大         (* 重複判定時のみ *)
見出し前=切                      ⇒  当該h1のh1前を注入しない
見出し後=切                      ⇒  当該h1のh1後を注入しない

4. コメント命令

命令             = "<!--", 空白, 命令本体, 空白, "-->" ;
複合命令         = "<!--", 空白, 命令本体,
                   { 空白, ( ";" | ";" ), 空白, 命令本体 },
                   [ 空白, ( ";" | ";" ) ], 空白, "-->" ;

命令本体 =
    改頁命令
  | 紙面命令
  | 伸行命令
  | 上浮抑制命令
  | 字下げ命令
  | ぶら下げ命令
  | 見出し番号命令
  | 見出し既定切命令
  | 類開始 | 類終了
  | 組み方命令
  | 分綴開始 | 分綴終了
  | 分綴言語開始 | 分綴言語終了
  | 浮開始 | 浮終了
  | 回込開始 | 回込終了
  | 割注命令
  | 超連結自動認識命令 ;

改頁命令         = "改頁" | "pbr" ;
紙面命令         = "紙面", 空白, ":", 空白, 紙面属性列 ;
伸行命令         = "伸行小" | "伸行中" | "伸行大" | "伸行"
                 | "vfil" | "vfill" | "vfilll" | "縦埋め" ;
上浮抑制命令     = "上浮抑制" | "suppressfloats" ;

字下げ命令       = "段落字下げ", 空白, ":", 空白, [ 長さ ] ;
ぶら下げ命令     = "段落ぶら下げ", 空白, ":", 空白, [ 長さ ] ;
長さ             = 数値, ( "em" | "マス" ) ;

見出し番号命令   = "見出し番号", 空白, ":", 空白, ( "有" | "無" ) ;
見出し既定切命令 = "見出し前=切" | "見出し後=切" ;

類開始           = "類", 空白, ( ":" | ":" ), 空白, 類名列 ;
類終了           = "/類", 空白, ( ":" | ":" ), 空白, 類名列 ;
類名列           = 識別子, { " ", 識別子 } ;

組み方命令       = "組み方", 空白, ":", 空白, ( "欧文" | "和文" | "切" | "自動" ) ;

分綴開始         = "分綴", 空白, ":", 空白, 分綴語列 ;
分綴終了         = "/分綴", 空白, ":", 空白, 分綴語列 ;
分綴言語開始     = "分綴言語", 空白, ":", 空白, 言語列 ;
分綴言語終了     = "/分綴言語", 空白, ":", 空白, 言語列 ;
分綴語列         = 非空文字列 ;
言語列           = 非空文字列 ;

浮開始           = ( "浮" | "float" ), [ 空白, 浮属性列 ] ;
浮終了           = "/浮" | "/float" ;

回込開始         = "回込", [ 空白, 回込属性列 ] ;
回込終了         = "/回込" ;

割注命令         = "割注", 空白, ( ":" | ":" ), 空白, 入切 ;
超連結自動認識命令 = "超連結自動認識", 空白, ( ":" | ":" ), 空白, 入切 ;

4.1 紙面属性

紙面属性列       = 紙面属性, { 空白, 紙面属性 } ;
紙面属性         = 属性名, "=", 属性値 ;
属性名           = "段組" | "columns" | "方向" | "文字サイズ" | "字数" | "本文幅" | "行数" ;
属性値           = '"', 値, '"' | "'", 値, "'" | 値 ;
属性 値域 単位
段組, columns 1 / 2
方向 / は試験中)
文字サイズ 正数 pt
字数 正整数
本文幅 正数 mm
行数 正整数
紙面属性の発効頁 = 次頁
推奨並び = 改頁, 紙面

4.2 伸行

入力 正規形 強度
伸行小, vfil 伸行小 1
伸行, 伸行中, vfill, 縦埋め 伸行中 2
伸行大, vfilll 伸行大 3
伸行集合 := 当該頁にある伸行の集合
最大強度 := 最大({ 伸行.強度 | 伸行 ∈ 伸行集合 })
配分対象 := { 伸行 ∈ 伸行集合 | 伸行.強度 = 最大強度 }
各 伸行 ∈ 配分対象 の伸長量 := 頁残余 / |配分対象|
各 伸行 ∈ (伸行集合 − 配分対象) の伸長量 := 0

4.3 状態遷移

命令 遷移
段落字下げ:値 字下げ := 値
段落字下げ: 字下げ := 1em
段落ぶら下げ:値 ぶら下げ := 値
段落ぶら下げ: ぶら下げ := 既定値
見出し番号:無 見出し番号状態 := 無効
見出し番号:有 見出し番号状態 := 有効
組み方:値 組み方 := 値
組み方:自動 組み方 := 既定値
分綴:値 分綴集合 := 分綴集合 ∪ 値
/分綴:値 分綴集合 := 分綴集合 − 値
分綴言語:値 分綴言語集合 := 分綴言語集合 ∪ 値
/分綴言語:値 分綴言語集合 := 分綴言語集合 − 値
割注:入 割注 := 有効
割注:切 割注 := 無効
超連結自動認識:入 超連結自動認識 := 有効
超連結自動認識:切 超連結自動認識 := 無効
見出し番号状態 = 無効 ⇒ 見出し番号を非表示 ∧ 番号カウンタを進めない ∧ 目次には含める

5. 行内拡張

行内拡張         = 伸空 | 固定幅空き | 脚注 | 後注参照 | 索引項目 | ルビ | キャプション | 相互参照 | 創作漢字 | 下線 | 装飾範囲 ;

伸空             = "<", 伸空タグ, "></", 伸空タグ, ">" ;
伸空タグ         = "Fil" | "Fill" | "Filll" | "fil" | "fill" | "filll" ;
固定幅空き       = "<Skip", [ 空白, "em=\"", 数値, "\"" ], "></Skip>"
                 | "<skip", [ 空白, "em=\"", 数値, "\"" ], "></skip>" ;

脚注             = "^[", 非空文字列, "]" ;
後注参照         = "[^", 識別子, "]" ;
後注定義         = "[^", 識別子, "]:", 空白, 非空文字列 ;

索引項目         = "[[", [ 読み, "@" ], 語, [ "|", 表示文字列 ], "]]" ;
読み             = 非空文字列 ;
語               = 非空文字列 ;
表示文字列       = 非空文字列 ;

ルビ             = "<ruby>", ルビ内容, "</ruby>" ;
ルビ内容         = 親文字, "<rt>", ルビ文字, "</rt>",
                   { 親文字, "<rt>", ルビ文字, "</rt>" } ;

キャプション     = "[", キャプション本文, "](", 種, [ ":", 標 ], ")" ;
相互参照         = '<Ref t="', 種, '" l="', 標, '">', 代替表示, "</Ref>" ;

創作漢字         = '<GW c="', グリフ符号, '">', 代替表示, "</GW>" ;
下線             = "<u>", 非空文字列, "</u>" ;
装飾範囲         = '<span class="', 類名列, '">', 非空文字列, "</span>" ;

親文字           = 非空文字列 ;
ルビ文字         = 非空文字列 ;
キャプション本文 = 非空文字列 ;
種               = 識別子 ;
標               = 識別子 ;
代替表示         = 非空文字列 ;
グリフ符号       = 識別子 ;

5.1 伸空・固定幅空き

入力 正規形 強度
<Fil></Fil> 伸空小 1
<Fill></Fill> 伸空中 2
<Filll></Filll> 伸空大 3
入力 意味
<Skip em="1"></Skip> 固定幅空き(em)。\hskip 相当。伸空とは別
伸空集合 := 当該行にある伸空の集合
最大強度 := 最大({ 伸空.強度 | 伸空 ∈ 伸空集合 })
配分対象 := { 伸空 ∈ 伸空集合 | 伸空.強度 = 最大強度 }
自然幅 := 伸空の幅を零とした当該行の幅
残余幅 := 最大(0, 行幅 − 自然幅)
各 伸空 ∈ 配分対象 の伸長量 := 残余幅 / |配分対象|
各 伸空 ∈ (伸空集合 − 配分対象) の伸長量 := 0

5.1.1 割り注

割注 = 有効 ∧ 全角普通文字のみの入れ子なし(…) ⇒ 二行組
対象外の括弧・コード・ルビ・数式・HTML内 ⇒ 通常組み。警告なし

5.1.2 超連結自動認識

超連結自動認識 = 有効 ∧ 裸の通信プロトコルURL ⇒ 行内コード化。表示は原文のまま
http(s) ⇒ 簡易紙面・本紙面・PDF でクリック可。リンク先のみ Punycode/パーセント調節
ftp / smb / afp / onion 等 ⇒ コード化のみ
www.のみ・相対URL・mailto / tel・javascript: ⇒ 対象外
超連結認識プロトコル ⇒ 既定スキームに加えて認識するスキーム名
初期 超連結自動認識 := 切

5.2 脚注・後注

脚注           ⇒ 参照出現頁の下部へ配置
後注参照.識別子 = 後注定義.識別子

5.2 索引

入力 読み 表示
[[語]] 自動
[[語|表示]] 自動 表示
[[かな@語|表示]] かな 表示

5.3 採番・参照

キャプション.番号 := 1 + 個数({ 前置キャプション | 前置キャプション.種 = キャプション.種 })
キャプション.出力 := キャプション.種 + キャプション.番号 + " " + キャプション.本文

相互参照.参照先 := 一意({ キャプション |
  キャプション.種 = 相互参照.種属性 ∧ キャプション.標 = 相互参照.標属性 })

参照先あり ⇒ 相互参照.出力 := 参照先.種 + 参照先.番号; リンク先 := 参照先
参照先なし ⇒ 相互参照.出力 := 代替表示; 警告 := 未解決参照
制約 論理式
標付きキャプションの一意性 ∀甲,乙: (甲.種=乙.種 ∧ 甲.標=乙.標) ⇒ 甲=乙
前方参照 許可
標なしキャプション 採番する、参照不可
図キャプション 画像と別行
表キャプション 対応表の直前。空行可。他ブロック不可
画像代替文 単独では採番しない

5.4 画像

画像参照         = "![", 非空文字列, "](", 画像ソース, ")" ;
画像ソース       = ローカル参照 | 外部URL | dataURL ;
ローカル参照     = ? ファイル名(一時品タブ) ? ;
外部URL          = "http://" | "https://", 許可ホスト, … ;
取得経路 条件
一時品タブ ファイル名参照。blob 経由で描画
data URL 許可 MIME・サイズ上限内
同一オリジン 相対 URL・自サイト絶対 URL
許可ホスト 下表のホスト(*.r2.dev はサブドメイン一致)
R2 プロキシ r2.dev / *.r2.dev/api/image-proxy?url= へ書き換え

許可画像ホスト

ホスト
i.imgur.com
i.ibb.co
i.postimg.cc
ik.imagekit.io
images.unsplash.com
imagedelivery.net
placehold.co
r2.dev
*.r2.dev
res.cloudinary.com
ucarecdn.com
制約 内容
許可外ホスト PDF 埋め込み不可。警告
SVG 実体 content-type と実バイトを優先判定。拡張子 .svg でも実体がラスタ(例: ImageKit の WebP 自動変換)ならベクタ埋め込み不可
R2 原稿には公開 URL を記載。取得時に image-proxy へ変換

6. ブロック拡張

拡張ブロック     = 浮ブロック | 回込ブロック | 目次ブロック | 索引ブロック | 後注ブロック | タグブロック ;

浮ブロック       = 浮開始命令, 改行, 本文, 改行, 浮終了命令 ;
浮開始命令       = "<!--", 空白, 浮開始, 空白, "-->" ;
浮終了命令       = "<!--", 空白, 浮終了, 空白, "-->" ;

浮属性列         = 浮属性, { 空白, 浮属性 } ;
浮属性           = 浮位置 | 浮様式 ;
浮位置           = ( "位置" | "position" | "data-position" | "data-float-position" ),
                   "=", 属性値 ;
浮様式           = "style", "=", 属性値 ;

回込ブロック     = 回込開始命令, 改行, 本文, 改行, 回込終了命令 ;
回込開始命令     = "<!--", 空白, 回込開始, 空白, "-->" ;
回込終了命令     = "<!--", 空白, 回込終了, 空白, "-->" ;

回込属性列       = 回込属性, { 空白, 回込属性 } ;
回込属性         = 回込側 | 回込幅 ;
回込側           = "側", "=", 属性値 ;
回込幅           = "幅", "=", 属性値 ;

目次ブロック     = '<div class="目次"', [ 空白, 'data-depth="', 目次深さ, '"' ], "/>" ;
索引ブロック     = '<div class="索引"/>' ;
後注ブロック     = '<div class="後注"/>' ;
タグブロック     = ? div, span等のHTMLブロック ? ;
構造 意味
/浮 囲まれた内容を浮動体化
位置="上" 上部候補
位置="下" 下部候補
位置="htbp" h/t/b/p候補
style="text-align: center;" 中央揃え
回込/回込 原稿位置の図または表の横へ本文を流す。浮きとは別
側="頭" / 側="末" 図版を置く側。省略時は末
幅="12字" 省略時は行長の半分。本文との間は1字
<div class="目次"/> 目次生成
<div class="目次" data-depth="値"/> 指定深さの目次生成
<div class="索引"/> 索引生成
<div class="後注"/> 後注一覧生成
回込.初版 = 単段横組
回込.二段組 = 全幅へ落とす
回込.縦組 = 未対応

7. 見出し番号

入力 既定出力
# 章 第1章 章
## 節 1-1 節
### 項 1-1.1 項

8. 出力

形式 内容
Markdown 入力原稿 .md(設定・様式もフロントマターに含まれる)
HTML 組版済み紙面
頁付文字列 .md。タグ付き PDF と同じ構造群の読順。柱・ノンブルは含めない
docx 構造書出。見た目再現はしない。数式は Word 数式/OMML。画像は media 埋め込み。ページ数上限なし
PDF 指定判型の組版結果(クライアント完結)
タグ付きPDF 設定「タグ付きPDF」が入のとき、見出し・段落・図・内部リンクの文書構造タグを付与。既定は切。柱・ノンブルは本文の読み上げ対象外。PDF/UA 適合表明ではない

8.1 一発

公開 Markdown の URL から紙面と PDF を作る入口。パスは /1(旧 /from-url も互換)。許可ホストの MD を markdown-proxy で取得する。紙面・設定 UI は通常アプリと同じ。編集器・原稿管理・IndexedDB 永続化は持たない。

9. 正規化

入力 正規形
題名
用紙, 判型
tocDepth 目次深さ
箇条字下げEm 箇条字下げ
Hyphenopoly 分綴言語規則
pbr 改頁
縦埋め, vfill, 伸行 伸行中
vfil 伸行小
vfilll 伸行大
<Fil></Fil>, fil 伸空小
<Fill></Fill>, fill 伸空中
<Filll></Filll>, filll 伸空大
suppressfloats 上浮抑制
float, /float , /浮

10. 最小完全例

---
題: 例示文書
紙: B5
方向: 横
段組: 1
h1前: 改頁
---

# 表紙

<!-- 類:文字中央 ゴシック 太め -->
例示文書
<!-- /類:文字中央 ゴシック 太め -->

<!-- 伸行 -->

# 本文

構成を<Ref t="図" l="構成図">図「構成図」</Ref>に示す^[脚注]。

<!-- 浮 位置="上" -->
![構成図](構成図.png)

[構成図](図:構成図)
<!-- /浮 -->

[[こうせい@構成|構成]]

<div class="索引"/>