プロット管理のためのマークアップ記法ROSEMARYとVSC向け拡張機能の紹介
VSC上で小説のプロットを書きたい!!
そう思ったことはありませんか。
筆者はあります。
筆者はVSCが大好きです。全ての文書をVSCで作成・管理したいと考えているほどです。そして、日常の文書をVSC上で編集するにあたって、この世で最も優れた記法がMarkDownです。大体はこいつでなんとかなります。
が、このMarkDown。小説の本文やプロットの執筆・管理に向いているかというと、残念ながらそうではないと感じます。文頭一字下げができませんし、プロットにしても固有名詞の管理やキャラクターの状態遷移など、工夫すれば表現できないことはないでしょうが、MarkDownでやる意味はありません。そのために作られたわけではないので当然です。
調べてみるとVSC上での日本語小説執筆を補助する拡張機能はあるようです。
実際使ってみるとなるほど、これは良いものです。
これで本文執筆の問題は解決しました。
しかし冒頭にも述べた通り私はVSC上で小説のプロットを管理したくて仕方ありません。VSC上で本文を執筆するなら尚更です。
まあ本文執筆の拡張機能があったのです。私と志を同じくする方がいることは確認済み。ならばプロットについても同様に……。
ありません。
少なくとも私は見つけられませんでした。非常に残念です。
しかし、世は大AI時代。
要件さえまとめれば私のCodexが火を吹きます。
そうして出来上がったものがこちらです。
ROSEMARY Plot Markup
プロット作成向けMarkUp記法ROSEMARYと、それをVSC上で利用するための拡張機能ROSEMARY Plot Markupです。VSCのマーケットプレイスからインストールできます。
使用例
この拡張機能を使用することで、以下のような形のプロットをテキストベースで作成することができるようになります。


拡張子
拡張子は以下のものを用います。
.rsmr記法
ここではROSEMARYの記法を紹介します。
block
プロット内の各話題はblockという単位で管理されます。
以下のように記述するとblock_nameという名前のblockが作成できます。
"block_name"{
}この状態でプレビューすると以下のように表示されます。

block_nameという名前のblockが作成されています。
block内にまだ何も書き込んでいないので、これはただの名前がついた空箱です。
またこのように記述するとblockをネストすることができます。
"parent_block"{
"child_block"{
}
}
field
blockとして作成した箱の中身を作成するためにfieldを用意します。
fieldの名前:文字列
のように記述することによってfieldが作成されます。
"block_name"{
field_name:example
説明:主人公とヒロインが出会う
}この状態でプレビューすると以下のように表示されます。

fieldが作成され、blockの中に記述されていますね。
さらに、以下のように記述すれば、field内での改行も行えます。
"long_text_block"{
long_text:[
これはとてもながーーーーーーーい文章のためのfieldです。
途中で改行することもできます。
]
}この状態でプレビューすると以下のように表示されます。field内で改行が使用できているのが確認できます。

attribute
attributeを記述すると、blockに属性を与えることができます。
主にblockの分類を目的とした機能です。
attributeを使用するには、ブロック名の後に[]で囲んだattribute名を指定します。
"佐倉ミオ"[character]{
age: 17
personality: "慎重"
goal: "父の真相を知る"
}この状態でプレビューすると以下のように表示されます。

属性を与えられたblockはプレビュー上での色が変化します。
attributeと、そのattributeによって変化するblockの色は、設定から自由に設定できますが、デフォルトでは以下のようになっています。

key-value
key-valueはattributeに付随する副次的な属性です。任意の文字列を指定できます。
主にそのattributeに共通の情報を記述する目的で用意しています。
key-valueは以下のように記述します。
ここでは"pov=ミオ"や"weather=雨"がkey-valueにあたります。
"雨の日の再会"[scene, pov=ミオ, weather=雨]{
summary: ミオと蓮が十年ぶりに再会する。
}この状態でプレビューすると以下のように表示されます。

tag
tagは、blockをその内容で分類したい時に用います。
tagを付与するには、attributeと同じように[]で囲んだ内部に#から始まる文字列を入力します。
ここでは"[#ミオ]"というタグを付与しています。
"雨の日の再会"[scene, pov="ミオ", weather=雨][#ミオ]{
summary: ミオと蓮が十年ぶりに再会する。
}この状態でプレビューすると以下のように表示されます。

list
MarkDown記法と同じ方法で、リスト・数字付きリストを作成し、field内で使用することができます。
リスト・数字付きリストともに、ネストすることが可能です。
"雨の日の再会"[scene, pov="ミオ"][#ミオ]{
summary: [
ミオと蓮が十年ぶりに再会する。
- ミオが駅に到着する
- 傘を閉じる
- ホームを見渡す
1. 再会
2. 沈黙
]
}この状態でプレビューすると以下のように表示されます。

セリフ
セリフは以下のように記述すると、プレビュー時に拡張機能の恩恵を受けることができます。
"雨の日の再会"[scene, pov="ミオ"][#雨]{
説明:以下の記述がセリフです。
ミオ >また会うとは思わなかった
}この状態でプレビューすると以下のように表示されます。

また、このセリフの記法はfield内でも用いることができます。
注釈
"^"を用いることによって、文章やセリフに注釈を付与することができます。
"雨の日の再会"[scene, pov="ミオ"][#雨]{
注釈:次のように記述すると注釈を付与できます。^この文章は注釈の説明です。
ミオ >また会うとは思わなかった^この文章はセリフです
}この状態でプレビューすると以下のように表示されます。

疑問と回答
以下のように記述すると、読者が感じるであろう疑問点とそれに対する回答を扱うことができます。
"古い鍵"[item]{
? なぜミオの父はこの鍵を残したのか
! 隠された地下室を開ける鍵だった
}この状態でプレビューすると以下のように表示されます。

block接続
Graph機能上で、各ブロックを示すノード同士を接続することができます。
block接続を扱うためには、
@ block名 矢印の種類
のように記述します。
"雨の日の再会"[scene, pov="ミオ"][#雨]{
summary: [
ミオと蓮が十年ぶりに再会する。
- ミオが駅に到着する ^ この動作は短く
- 傘を閉じる
- ホームを見渡す
1. 再会
2. 沈黙
ミオ >また会うとは思わなかった ^ 小さな声
]
@ "古い鍵" -->
@ "佐倉ミオ" -.->
@ "蓮" ==>
}矢印は
実線
破線
太線
双方向実線
の四種類を用意しており、それぞれ以下のような記述と対応しています。
@ "古い鍵" --> ^実線
@ "佐倉ミオ" -.-> ^破線
@ "蓮" ==> ^太線
@ "蓮" <--> ^双方向実線また、矢印の部分に文字列を記述することによって、Graph上で矢印の上に文字列を描画することができます。
@ "古い鍵" --"使用"-->
@ "佐倉ミオ" -."関係"-.->
@ "蓮" =="関係"==>プレビュー上では以下のように表示されます。

meta
MarkDownと同様に、ファイル頭部分にMetaデータを記述することができます。
また、Graph機能のON/OFFの指定も可能になっています。
---
title: "雨の記憶"
genre: "ミステリ"
graph: true
---プレビュー上では以下のように表示されます。

include
rsmrファイル内で、他のrsmrファイルに記述した内容をgraph上に表示したり、後に紹介する拡張機能の対象とすることが可能です。
例えば、alpha.rsmrとbeta.rsmrが存在するとき、alpha.rsmr内で以下のように記述すると、alpha.rsmrではbeta.rsmrの内容を使用することができます。
@ include beta.rsmrこの機能を使用することによって、キャラクター、世界観設定などを個別のファイルで管理し、プロットを作成するファイルでincludeして使用することができるようになります。
機能
ここでは拡張機能:ROSEMARY Plot Markupの機能を紹介します。
block名のハイライト
blockの名前として定義された文字列が、他の文章中に現れた場合、これをハイライトします。
この機能は、includeされたファイルのblock名と同じ文字列も対象になります。
以下の例では、"佐倉ミオ"というblockが定義されており、同様の文字列が"古い鍵"block内で現れた際にハイライトが行われています。

またこのハイライトされた文字列を右クリックすると表示される選択肢から、そのblockの定義にジャンプすることができます。
block詳細のパネル表示
block名としてハイライトされた文字列をマウスでホバーすると、blockの内容を示すパネルが表示されます。
この機能は、includeされたファイルのblock名と同じ文字列も対象になります。

不要なブロックの折りたたみ
表示する必要のないプレビュー上のblockは、block左上にあるボタンから折りたたむことができます。
blockを折りたたんだ場合、対応するエディタ上のblockも自動的に折りたたまれます。
また、エディタ上からblockを折りたたんだ場合にも、対応するプレビュー上のブロックが自動的に折りたたまれます。

おわりに
今回は自作した、VSC向けテキストベースのプロット作成のための拡張機能ROSEMARY Plot Markupを紹介させていただきました。
個人的には満足のいくできになっている反面、まだまだ荒削りな部分も多いと感じます。使用していく中で改善するつもりです。
正直なところ、筆者以外に需要があるかはわかりませんが、ご興味を持ってくだされば筆者が喜びます。
ご意見やご要望があれば遠慮なくご報告ください。
