コンテンツにスキップ

アンカーと修飾子体系 (Anchor-Decorator)

Ktory のコア構文哲学と実行拍モデル

アンカーは拍や選択肢を宣言し、修飾子は引数を持ちます。本ページは 2026-10-22 の新契約です。実装・検証は進行中で、インストール済みバージョンとは異なる場合があります。

書き方 構造 既定の動作
話者: セリフ/: 地の文 TextStep Main は有効な入力を待つ
空 :/: .effect() TextStep 同じヘッドの前の文の表示を終了し、タグ実行後に入力を待つ。BGM などの継続リソースは停止しない
#/#.effect()/子のない #do DirectiveStep 独立指令は自動で続行
*/+ 子項目のある #choice ContainerStep Main は選択、補助は全体を無視

インデントで指令とコンテナを区別するため、すべての # が自動ではありません。節と再生ヘッドの役割は別です。旧 #parallel/#lane は明示的な移行が必要です。

アリス: 信じられない…… .next(seconds=0.5)
#.sfx("door")
: .camera_shake(0.5)
#.wait(seconds=3)

組み込み引数は名前付きで記述します:.clock(name="song")、.track(source="Lyrics", name="lyric")、.at(value=3, clock="song")、.wait(seconds=2)、.next(seconds=1)、.duration(seconds=3)、.skippable(enabled=false, seconds=3)、.loop(count=2)。本版は組み込み位置引数に対応しません。.bgm("main", volume=0.6) などのホストタグは位置引数も使え、実際の効果はホストが実装します。

.tag と .tag() は同じですが、ゼロと省略は別です。任意の引数をすべて埋める必要はありません。引数なし wait は主言語の読書時間、next は 0 秒です。ブロック内に先行アンカーのない修飾子は位置付きエラーとなり、別の節や分岐へ吸着しません。

wait と next は全文表示完了時に同時に開始し、文字のない拍では進入時に開始します。wait は最低制限で、自動進行を有効にしません。next は自動進行を予約し、組み合わせは max です。.wait(seconds=2).next(seconds=5) は 2 秒後から入力可能、5 秒で自動進行します。.wait(seconds=5).next(seconds=2) は 5 秒まで待ちます。wait/skippable に拒否された手動クリックは破棄し、保留しません。

独立 # は既定で自動なので #.wait(seconds=3) は 3 秒後に続行します。: .wait(seconds=3) はその後新しいクリックを待ちます。表示中の許可されたクリックは全文表示だけを行います。Main の AUTO も最低待機を守ります。

duration は wait と同時に始まりますが、advance を妨げません。有効な advance で次の文に入り、その時点で同じヘッドの前の文を撤去します。表示先が変わっても同じで、空 : も前の表示を終了します。次の at ゲートでの待機中や EOF/stop 後は、元の表示寿命まで残せます。表示終了は Main を進めず、wait も文字を自動消去しません。

補助は at/Core 境界まで直ちに続行し、wait/next/AUTO や読書推定を待ちません。補助の duration も表示だけに作用します。旧 duration/フェード通知で新しい表示を消してはいけません。

*斜体*、**太字**、~~取り消し線~~、[書庫]{しょこ} を使えます。現在の脱糖処理は <ruby="しょこ">書庫</ruby> などのタグ文字列を出力し、独立した Ruby 構造体を出力しません。ネイティブタグもそのまま渡され、対応可否は描画側が決めます。

予約文字をそのまま表示する場合はバックスラッシュでエスケープします。Markdown の見出し、リスト、コード囲みをセリフ構造として使わないでください。Web と Unity のリッチテキスト表示はそれぞれ検証が必要です。

プレーンテキストの断片とブロック

Section titled “プレーンテキストの断片とブロック”

そのまま表示したい内容を、3 個以上の ASCII シングルクォートで囲みます。本文への埋め込みと複数行の両方に対応します。

アリス: '''.wait'''と書きたい。外側の **太字** は有効。 .wait(seconds=1)
アリス:
@ja: '''
.wait
// この行も本文
<b>**太字にはならない**</b>
'''
@en: Text containing '''.wait'''.
.next(seconds=1)
: ''''ここでは ''' をそのまま表示''''

囲み内では、修飾子、コメント、言語ラベル、制御フロー、Markdown、Ruby、ネイティブタグ、バックスラッシュのエスケープを解釈しません。外側の修飾子は拍全体に付きます。複数行でも 1 拍であり、言語ごとに通常の本文とプレーンテキストを混在できます。

開始と終了のクォート数は同じで、3 個以上が必要です。内部の異なる長さの連続クォートは文字として扱い、入れ子にはしません。内容中の連続クォートより長い囲みを選びます。''' だけを表示する場合は、4 個のクォートによる複数行ブロックの本文行に書き、区切りと連結させないでください。曲線の引用符は常に通常の文字です。

行内の断片は内部の空白を保持します。開始直後に改行するブロックは、開始/終了の配置用改行と本文の共通インデントを除去し、相対インデント、内部の空行、行末空白を保持します。タブは 2 桁です。囲みが閉じていない場合は、開始行と列を報告して読み込みを停止します。

ホストは各言語の出力に Segments があれば、IsLiteral=true の断片を空白を保持した文字として表示し、他の断片に既存のリッチテキスト処理を適用します。連結済みの Content 全体をタグとして再解釈すると、この区別が失われます。共通 Reader は対応済みで、他のホストでは描画側の対応が必要です。