Visual Studio Code用の小説執筆機能拡張、novel-writerの3.4.12を公開しました。今回のリリースでは以下のバグを修正しています。 HTMLスタイルコメントが文字数に不正に登場しているのを修正しました VS Codeでエディターを選択した時に、原稿ツリーがアクティブになってしまう問題を解消しました 原稿ツリーでファイル名を変更するときは、一度クリックしてからEnterキーを入力してください HTMLスタイルコメントが原稿用紙プレビューで正しく表示されるように修正しました 今回のバグフィックスはHTMLコメント機能に関するものが多くなりました。プログラミング言語では当然のように使うコメントですが、小説で使っている話はあまり聞きません。メモや参照テキストが欲しければ別ファイルに書いておく人がほとんどでしょう。私もnovel-writerを作るまではそうしていました。しかし、novel-writerで原稿にコメントを入れる機能を作ってみると、これが意外と便利に使えることに気づきました。 novel-writerでは、テキスト原稿に <!-- [comment] --> でHTML形式のコメントを挿入することができます。VS Codeはプログラミングエディターなので簡単にコメントを作成できる。Command(あるいはCtrl)+/(スラッシュ)で、選択している行がコメントになるし、コメントを外すのも同じコマンドが使えます。 右の、原稿用紙プレビューの下部にコメントが表示されている 文中にコメントを書くのは抵抗がある人がいるかと思いますが、断片的な資料を挿入するのにはとても便利です。例えば外国語を挿入するとき、以下のように書きます。 アルバートは敷石の抜けた歩道を睨んで悪態をついた。 「|くそっ《ディウ》。|クソ道め《ティウセイロウ》。|クソ労働者め《セイグンヤン》!」 <!-- 屌! / diu2 / ディウ 條死路! / tiu4 sei2 lou6 / ティウ セイ ロウ 死工人! / sei2 gung1 jan4 / セイ グン ヤン --> 僕にはわからない広東語だけど、意味はわかった…… 見ての通り原稿には広東語の漢字が書いていませんが、セリフのすぐ下に原文が書いてあれば、後から参照するのも楽です。年号や間取り、状況に関するメモをコメントにしておくのもいいですね。 この数ヶ月、時代小説を書いていたので、外国語や、旧暦新暦の日時対照、変化する地名など、文中にメモを残したいことが多くてコメントをたくさん使っていて、不具合があることに気づいたというわけです。原稿進んでないはずなのに進捗2,000文字……とか。 PDFを作成するときはもちろん消えます。いずれは原稿のコンパイルの時にコメントを削除する機能も搭載しようと思いますが、もう少し待ってください。自動見出し機能をつけたいんですよね。 そんなわけで、novel-writerは今日も修正が続いています。さあ、書くぞ。
Category: novel-writer
ファイル名のナチュラルソート
novel-writer 3.4.9~3.4.11に関する開発ノートです。 novel-writerはファイルの並び順を以下のような文字列ソートで行っていました。ファイル名を表現している文字コードの番号が小さい方から順番に並べる方法です。 1-冒頭情景.txt 10-言葉の応酬.txt 11-プロローグ終了.txt 2-主人公登場.txt 3-友人との対話.txt 4... 文字列ソートで「1-冒頭情景.txt」の次にくるのは「2-主人公登場.txt」ではなく、「10-言葉の応酬.txt」になります。奇妙に見えるかもしれませんが「10」の「1」は「2」よりも番号が若いので、文字列ソートでは「1, 10, 11, 2, 3...」のように並んでしまいます。 使いにくいことはわかっていて後回しにしてたのですが、Xで「これはバグかな」という疑問の声を見かけたので、この際手を入れることにしました。Mac OSのFinderもWindowsのExpolorerも少し前までは文字列ソートを行っていましたが、今や自然な順番に並んでいるので、これがnovel-writerのバグだと思われても仕方がありません。使い始めた頃は文字列ソートだったVS Codeも自然順ソートに変わっています。何より私も不便には思っていたのです。 実装は思ったよりも簡単に終わりました。 npmのNatural Compareを追加して、ファイルのリストを内部的に作っているところに並び替えを行う機能を追加しただけ。これでテキストの結合と、原稿のファイル名が自然な順番に並ぶようになりました。地味な変更ですが、使いやすくなっていると思います。OSやプラットフォームのVS Codeと並び順が一致したのは嬉しいものです。Natural Compareは「EP1、EP2..EP10」のような接頭辞のあるナンバリングにも対応しているようなので、私が気づいていないところでも使いやすくなるかもしれませんね。 それでは執筆をお楽しみください。
一行目のルビがおかしい
HTMLの規格にrubyが提案されたのは2001年。GPTやGeminiに雑に聞くと2014年のHTML5と答えるかもしれないけど、Mac OS 10.4 TigerのDashboardで遊んでいた頃には動いていたはずだから、2005年から数えて20年近く付き合っていることになる。 そしてその頃からずっと、一行目のルビが親要素のマージンを広げてしまう問題に悩まされている。 「傍」のルビが二段落目のマージンを広げてしまっている 上の例では、二段落目の「傍」につけたルビが段落のマージンを広げてしまっている。これは縦書きでも同じ問題を引き起こす。 2段落目の「指定」につけたルビがマージンを広げてしまっている 0.2文字幅程度のわずかなズレなのだけど行が揃わないのは美しくないし、40行入れようと思った時に入らず溢れてしまったりもする。CSSから印刷物を作るCSS組版では致命的な問題なので、ルビを扱う時はいつもなんとかできないかとあの手この手を試して、情報を集めてもいた。flexでレイアウトしてみるとかabsoluteにしたらどうかとかcss transformならいけるかとか……でも、どれも無理だったね。 rubyタグにdata-rubyみたいなアトリビュートを追加して、CSSのbefore擬似要素をレイヤーのように載せる方法は面白かったけれどルビの字数が多い時はうまくいかない。 驚くかもしれないけど、KindleやKobo、AppleのBooksでも同じ問題は出る。1行目にルビがあるとちょっとだけ行が太るのだ。この問題が出ていないように見える電子書籍に出会うこともあるけど、よく見ると行送りが大きくて目立たないだけだったり、たまたまそのページで問題が出ていなかったりするだけだったりする。十年前は「いつか治るだろう」と思ってたけど、まさか直らずにここまで来るとは思っていなかった。 私の作っているnovel-writerでも、もちろんこの問題が出る。原稿用紙プレビューには枠線があるので、ずれがはっきり見える。 しかし印刷となるとそうはいかない。使いやすいPDFプレビューを搭載したおかげで、このずれが気になる場面が増えてきたので、解決することにした。 1行目にルビが出てくる段落のマージンを減らすのだ。 novel-writerは原稿用紙やPDFのプレビューを行うときに、段落ごとにルビや圏点のタグを埋め込んでいる。この時に、1行の文字数よりも手前に<rubyが来る段落は右(あるいは上)マージンをズレの分だけ減らせば、ズレは消えるはず。というわけで実装してみたらうまくいったので、3.4.5としてリリースした。 乱暴な方法だけど20年越しの問題が解決したので、ちょっと気が晴れた。 でも、いつか直ってほしいなあ。
novel-writer 3.4.0公開
novel-writer 3.4.0を公開しました(ドキュメントを調整したので現在のバージョンは 3.4.1になっています)。3.3.4から3.4にマイナーバージョンが上がっている理由は、PDFプレビューに大きな変更を加え、インターフェイスも変わったからです。 novel-writer 3.4.0では、外部のアプリケーションで実行していたPDFプレビューをVS Codeのエディターとして開くことができるようになりました。 3.3.2までのPDFプレビューはChromiumが外部が外部で起動していた 3.4.0でプレビューは内蔵された また、二つのプレビューを起動するためのボタンをエディター上部に追加しました。 右が原稿用紙、左がPDFプレビューです。両方同時に使うこともできますし、カスタムCSSを使えばPDFの方は原稿用紙と異なるレイアウトで確認することも可能です。 利用しているエンジンは引き続き、CSS組版ライブラリのVivliostyleです。HTMLやCSSに策定されたいる印刷関連の仕様を実現してくれる素晴らしい環境です。今まではVivliosyle CLIというコマンドラインアプリケーションを利用していましたが、3.4.0ではVivliostyle Coreを組み込んで、内蔵アプリケーションとして実行しています。ユーザーインターフェイスのあるCLIやViewerと違い、Coreではページ送りのインターフェイスも作らなければならなかったのですが、新たにChromiumを起動する手間がなく、novel-writer専用の機能を追加もできるのでメリットの方が大きいですね。 昨日のブログに投稿した動画は『マン・カインド』の連載版原稿472ページをを丸ごとPDFプレビューしています。これだけ長いテキストだと、タイプするたびに全てのテキストの縦書きプレビューを作る原稿用紙プレビューではレスポンスが悪くなってしまいますが、一度作ってしまえばVivliostyleの中で保持してくれるPDFプレビューは軽快に動作します。 https://videopress.com/v/uSH3MYwu?resizeToParent=true&cover=true&posterUrl=https%3A%2F%2Ftaiyolab.com%2Fwp-content%2Fuploads%2F2025%2F03%2Fpdfe38397e383ace38393e383a5e383bce588b7e696b0_mov_avc_240p.original.jpg&preloadContent=metadata&useAverageColor=true エッセイやショートストーリーの2、3ページから短編の十数ページ、そして長編の何百ページにまで対応しなければならないページ送りのインターフェイスもいいものができました。スクロールバーではこうはいきません。いずれ章の名前などもこのページボタンに付与したいものです。 今回、PDFプレビューにもプレビュー側をクリックしてエディターの該当行を表示する機能を組み込んでみました。泣き別れした段落(ページ送りで分割された段落の後半)をクリックすると正しいカーソルの位置に飛んでくれなかったりするのですが、ゲラからテキストが一瞬で探せるのはなんかすごい。原稿用紙プレビューにもつけていた機能ですが、印刷物の体裁からジャンプできるとまるで体験が変わります。短編小説ならテキストを分割しなくても書けるかもしれません。そうなるとアウトライン機能も欲しくなりますね。 今までPDFプレビューは出力前の確認にしか使っていなかったのですが、レスポンスよく動作する内蔵プレビューになったおかげで、執筆中の確認にもPDFプレビューを使うのが楽になりました。リアルタイムの原稿用紙プレビューには別の良さがありますすので、棲み分けながら強化していきましょう。 複数に分割した原稿を結合してプレビューし、プレビューから該当する原稿を開いて編集できる機能が欲しくなりますね。バージョン5ぐらいまでには実現したいものです。
PDFプレビュー内蔵
仕事が立て込んでいると、ついついnovel-writerの改良に手をつけてしまいたくなります。あんなことができれば、こんなことができれば、という焦りをバネに執筆を急ぐわけなんですが、フラストレーションを溜めても仕方がないので、空き時間に少しずつnovel-writerの改良も進めてしまいます。 もうすぐ、来週から再来週あたりに公開する3.4.0ではついにVivliostyleを内蔵します。3.3.2でもVivliostyle CLIの外部インストールが不要になりましたが、今回のバージョンではVivliostyleの心臓部(Vivliostyle Core API)を用いて、プレビューをVS Code内部に組み込んでしまいます。何が嬉しいってChromium(開発用のChrome)を起動する必要がないので早いし、novel-writerのための機能も組み込めます。例えば3.4.0では、プレビューをクリックしてエディターの該当箇所をハイライトさせたり、また逆にエディターで選択した行をプレビュー側でハイライトしたりする機能も組み込んでいます。 文章だけではわかりにくいでしょうから、まずはご覧ください。 『マン・カインド』連載版の原稿の第一部を丸ごとプレビューさせてみましたが、軽快そのもの。矢印キーでページ送りすることもできますし、プレビュー下部のページ選択バーで選択することも可能です。PDFプレビューはカスタムCSSも動くので横長の用紙を作ったり、シナリオのような特殊な組版にも対応できます。こうなってくると欲張りたくなるもので、コンパイルから全編プレビュー、そしてプレビューをクリックして分割した原稿に戻ってくるというワークフローなんかも視野に入ってきます。プレビュー側に働きかけることも可能になったので、プレビューに赤字を入れてエディターにdiffを書く推敲モードなんてのも作ってみたい。分割して書くことに慣れていたんですが、これぐらいプレビューが早いなら短編は一つのテキストファイルで書いてもいいかなあ、なんて思っちゃいますね。マークダウン形式の#見出しの折りたたみには対応してるので、アウトラインを意識した書き方もできるでしょう。 PDFプレビューがかなり使いやすくなったので、原稿用紙プレビューの立ち位置も変えられます。二つのプレビューがあるので、それぞれの役割をより考えてみたくなりました。 そんなわけで原稿に戻ります。
