
2026/11/01 22:51
グロフとのノベラ短編集
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
2026 年 10 月 31 日のブログ投稿において、開発者が無料のコマンドラインツールを用いて 2 つの自作ノベルを制作するための簡素化されたワークフローを共有しています。最初のノベル(約 50 ページ/A5 判/約 15,000 語)は作成に 7 か月以上かかったのに対し、2 つめのノベル(約 120 ページ/約 4 万字)は 2025 年 7 月からの集中的な読書期間を経て、わずか 10 日で完了しました。執筆は Vim の Goyo プラグインを用い、フルスクリーンモードで実装し、ハードラップされた段落構造を採用するとともに、最小限の distraction(ブラウザや時計を表示しない)を実現しています。バージョン管理には Git を使用しており、デバイス間での同期を定期的なコミットのみで行うことを目的としています。組版は Groff/Troff に依存しており、カスタムパッケージ
macros.groff がヘッダー(.SH)、段落(.PP, .LP)、フッター、ページ番号(トラップ処理による)を制御します。PDF は A5 ドキュメントとして出力され、厳密にドイツ語のタイポグラフィ規則に準拠しています(句読点後の句間スペースを無効化、ピリオド後の二重スペースルールの抑制、特定の活字分割規則)。前処理では Perl スクリプトを用いて Markdown 様式の構文を Groff マクロに変換します。この最小限なスタックは、商用ソフトウェアを使用せずにもドイツ語組版によるプロフェッショナル品質の書籍制作が可能であることを示しています。プロジェクトには demo-book.tar.gz のスケルトンが含まれ、コンテンツの深さを重視する作家向けの再現可能なテンプレートとして提供されています。ただし、著者はペース配分およびキャラクターの一貫性に関する改善余地を認めており、さらに Groff の学習を予定しています。本文
デスクトップ環境での小説執筆と groff 組版実験記(2026 年)
2026 年 10 月 31 日時点のブログ記事より、技術的な執筆環境の詳細を整理します。
執筆の経緯と成果
- ノベルの完結
- 第一作: A5 サイズ約 50 ページ(文字数:約 1.5 万字)。
- 第二作: A5 サイズ約 120 ページ(文字数:約 4 万字)。
- 期間の違い
- 第一作:7 ヶ月以上かかった。
- 第二作:わずか10 日間。
- 読書習慣の転換
- 2025 年 7 月頃、放置されていた本を読み始めてからはめり込んだ。
- その後は約 30 の小説を読み上げ(数日〜3 ヶ月ほどのペースで)。
- 技術以外の創作活動は以前は苦手だったが、今回は手作業をすることに没頭できた。
使用ソフトウェアの概要
- groff (Linux)
- マニュアルページの組版システムをフル機能化して本を作成。
- 特徴: コマンドが少ないため高速(50 ページで 700ms、120 ページで 1.6 秒)。
- 出力品質: 高解像度な PDF 生成が可能。
- Markdown
- 創作プロセスでの入力形式として使用。
- メリット: 人間が読みやすい「視覚的」なテキストとして記述可能。
- 制限: フル機能の Markdown はせず、章タイトル、空行、強調(
)のみを使用。*foo*
- Vim
- 執筆エディタとして使用。
- Goyo プラグイン: UI を最小化し、没頭した執筆環境を構築。
- フォント: UW ttyp0 の 11x22 バリアントを使用。
- Git
- バックアップとラップトップ・デスクトップ間の同期用。
- コミットメッセージは省略する簡易管理。
groff による組版詳細
基本的なフォーマット
独自の小さなマクロパッケージを作成し、以下の 3 つのマクロのみを使用している。
| マacro名 | 機能 | 実装例 |
|---|---|---|
| セクションヘッダー(章タイトル) フォントを大きく・中央揃えにする | |
| 通常の段落(ハングインデント付き) | |
| 長い段落(大きな空白を挿入) 時間飛躍などに使用 | |
- コマンド検索: 個別コマンドは
で確認。man 7 groff - PDF 生成コマンド:
groff -Tpdf -dpaper=a5 -P-pa5 macros.groff chapter01.groff >book.pdf
フッターとページ番号の設定
デフォルトではページ番号が表示されないが、印刷用 PDF では必須とするため以下を設定。
設定手順
- フッター領域の定義: レジスター(変数)でサイズを管理。
.nr _FooterSize 5v - ページ下部へのトラップ配置:
.wh -\n[_FooterSize]u _FooterTrap
_FooterTrap
マクロの解説
_FooterTrap.de _FooterTrap .\" 環境を切り替える . ev _FooterEnv .\" デフォルト設定のコピー . evc 0 .\" ページ 1,2(タイトルページ)はスキップ . if \\n[%]>2 \{\ . . sp |\\n[.p]u-2v ! 垂直位置の計算(詳細後述) . . ce ! 中央揃え . \fR\\n[%]\fP ! ページ番号を出力 . \} .\" 元環境に戻り、ページブレークを発行 . ev ' bp ..
- 注意点:
(ノーブレイク)を使用しないと無限ループや位置ズレが生じる。'bp - TODO: ヘッダーとフッターの対称性を完全に整えていない。
文間の空白の制御
ドイツ語では文後に 2 スペースを置かない習慣があるため、デフォルト挙動を抑制。
.ss 12 0 ! 単語間空白:12, 追加文間空白:0
ドイツ語のハイフネーション
2006 年の新しいドイツ語規則(Deutsches Neue)に対応するため設定。
.hla den ! German language definition .hpf hyphen.den ! Hyphenation rules
Markdown と前処理の workflow
マークダウンからの変換プロセス
- 入力形式: Markdown(章タイトル、強調など簡易版)。
- ツール: Python で HTML 化も可能だが、HTML の整形は可読性が低い。Perl を使用して直接 groff 形式へ変換。
- 変換スクリプト (
):perlperl -0pe ' # U+201E/U+201C を Guillemets (<>) に置換 s/... German typographic quotes .../... Guillemets .../g; # "# Title" -> ".SH \\"Title\\"\\n" s/^# ([^\n]+)\n/.SH "\1"\n/smg; # "---" -> ".LP" s/\n---\n/.LP/smg; # 空行 -> "\n.PP\n" (段落区切り) s/\n\n/\n.PP\n/smg; # "*text*" -> "\fItext\fP" (強調表示) s/\*([^*]+)\*/\\fI\1\\fP/smg; ' - 出力: 自作の
を使用した groff 入力ファイル。macros.groff
Vimでのリフロー化
- アプローチ: 「ハードラップ(物理的改行)」方式を採用。
- 一文を一行に配置(スクロールやソフトラップを排除)。
- groff が句読点を正しく検知し、適切な空白を挿入する仕組みを利用。
- リフロー手順 (Vim):
に設定:~/.vimrcset nojs ! "nojoinspaces"(文後の二重スペース禁止) map Q gq} ! クリップボードを介して段落一括整形- カーソルを段落の先頭に置いて
を押すことで、物理改行から論理的改行へ変換。Q
- メリット: テキストが正しく解釈され、diff も最小限に抑えられる。
Git と執筆プロセス
データ管理戦略
- コミット頻度: 定期的なステート保存のみ。
- コミットメッセージ: 省略(簡易バックアップ・同期用として位置づけ)。
- リソース:
のスナップショット公開あり(本物の出版はなし)。demo-book.tar.gz
執筆の難点と学習曲線
- 世界観の構築: 歴史やルール、キャラクターの設定を整合させることが想像以上に困難。
- キャラクターの動機や知識が一貫しているか常に検証が必要。
- 解決策: 次回以降は「キャラクターインベントリ」を作成しプロフィール化する予定。
- 校正の難易度:
- 長文(120 ページ)を校正するには時間がかかる。
- プレースメントや展開の早さが偏っている箇所を発見した。
- 没頭状態 (Flow):
- 第二作執筆時に「キーボードに触れずともアイデアが湧く」集中体験を得た。
- 目標: そのようなトンネル(集中)状態を日常化したい。
次のステップと結論
- 出版: 現時点ではウェブ公開のみで、批評に晒す意図はない。
- LLM の使用: プロンプトエンジニアリングを試みる提案は却下。
- 今後の課題:
の深層(トラップの制御等)への掘り下げ。groff- 文体の多様化と詳細度の向上。