
2026/10/31 0:48
Florilegium:LaTeX による手続き的フローラ
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
この革新的な LaTeX システムは、Lua において PDF の作成中に計算されるパラメトリック曲線のみを使用して、外部アセットや画像なしにユニークなデルフトブルーの花卉装飾縁を手順的に生成します。各ページには、ページ番号から派生したシードに基づいて個別の庭園が割り当てられ、確率的ロジックではなく決定論的ロジックを通じて安定性が確保されます。システムは 2 つのモードで動作します:「authored」モードでは水彩風プリミティブ(平洗い、濃いシミ、白いストリークによる引き上げ、裂葉、 forget-me-not のシーム、イヴリーブレードの花紋)の手動配置を行い、「grown」モードでは SIGGRAPH 1998 の装飾文献に触発された貪欲な空間充填ループを採用します。システムは A4 レイアウトで 68 mm の余白を備えたり、最後のページの空きスペースを自動的に満たしたりすることに適応します。追加機能には、春から秋までの季節的な経年変化や、蝶や蜂、カタツムリ、鳥などのランダムな訪問者の実装が含まれます。また、OKLCH 空間における「ink」に由来する単一色のパレットも採用されています。システムは LuaLaTeX ドキュメント内で
\florilegiuminitial、\florilegiumbloom、見出し用の花を持つ sections、そして aging/novisitors オプションをサポートします。イニシャルは、デフォルトの Latin Modern Bold の OpenType フォントから文字の輪郭を読み取ることで作成され、反転部やストローク内部に蔓と花卉による装飾が描かれます。ユーザーは Ghostscript を使用して自己完結型の PostScript ファイル(postscript/florilegium.ps)を直接 PDF にレンダリングでき、その際 -dALLOWPSTRANSPARENCY フラグを使用します。アニメーションツールによって成長シーケンス(例:build/grow-6.gif)や空間充填プロセスの可視化を行う説明的 GIF(例:build/grow-6-explain.*)を生成できます。ローカルの TeX 環境を持たないユーザー向けに、Docker ビルド(tools/in-docker)と Overleaf セットアップガイドが提供されています。プロジェクトは MIT ライセンスの下で公開され、さらなる変更やアニメーションのためによりコア Lua モジュールである ink.lua、flora.lua、grow.lua、authored.lua、florilegium.lua、および initial.lua が含まれています。本文
Florilegium: 手書き風の手続き的レイアウトによる LaTeX 用余白
概要
- 目的: LaTeX ドキュメントの**余白(マージン)**を手書き風の花卉で装飾するプロジェクトです。
- アプローチ:
- 既存の作品のコピーではなく、独自のアプローチにより同様の雰囲気を再現しています。
- 1998 年の装飾文献に基づく手続き的なレイアウトと、ランダム化されたパラメータを持つ手書きプリミティブを組み合わせます。
- 特徴:
- 画像ファイルの読み込みや外部アセットは一切使用しません。
- すべての花びら、葉、茎は Lua で計算されたパラメトリック曲線です。
- 水彩色画のように描画され、そのまま PDF に書き込まれます(各ページに独自の庭園が生成されます)。
構成要素と環境対応
ファイルと機能
プロジェクトには以下の 3 つの主要なドキュメントが含まれます。
: ベースとなるファイルflorilegium.tex
: **成長型(生成風)**の構成を使用する場合florilegium-grow.tex
: その他の機能を実演するためのモジュールcomposition
2 つの主要なモード
(手書き風)authored- 茎、葉、花を手動で配置します。
- 各パラメータをサンプリングした構成です。
(生成風)grown- グリディアル(格子状)な空間埋め込みループを用います。
- ページ内に収まるように植物が自動成長します。
環境への適応
: A4 サイズ、余白 68 mm に調整された設定(デフォルト)。nothing
: テキストの下の最後のページの自由なスペースにも適応します。the page layout
プレビューと成長プロセス
プレビュー画像の構成要素 (300 dpi)
白いスチーク(点描)や脈紋など、以下の要素が含まれます。
- モットルワッシュ: 白いスチークを浮かび上がらせた効果
- 裂葉: 脈紋が入った葉
- スリムプスの円錐花序 (Cyme)
- ゴーストフラワー: 茎の後ろに浮かぶ薄い花
成長のメカニズム (watch it grow
)
watch it grow空いた余白から完成したページへの変化を追跡します(例:種「6」を使用)。
- 初期段階: 最初に茎が伸び、先端がノードを越えるにつれて葉が開きます。
- 開花: 各茎は最終的に花で終わります。
- 空間埋め込み:
- グリディアルなループが主導権を握り、枝が成長する直前に見つけた最大の自由な円盤から順に穴を埋めます(破線の円で示される)。
- 大きな穴はゆっくり、小さな穴は高速で埋まります。
- 来訪者の登場: 蝶々や蜂が飛び入り、鳥が枝にとまり、カタツムリが茎を這います。
再生と可視化
- 成長過程は一度記録され、各フレームでランダム抽選を繰り返して再生されます。
- コマンド実行例:
make grow-6- 約 45 秒のアニメーション (
,build/grow-6.gif
) が生成されます。.mp4 - 成長中の「破線の円(最大の自由な円盤)」を表示するには、
を追加します。EXPLAIN=1
- 約 45 秒のアニメーション (
テキストとの連動 (インタラクティブな余白)
余白は周囲のドキュメントの内容に反応して変化します。
イニシャル (\florilegiuminitial
)
\florilegiuminitial
で段落の最初の文字「E」を 5 ライン分のタイル内に配置します。\florilegiuminitial[5]{E}- 描画方法: OpenType フォント(デフォルト:Latin Modern Bold)から輪郭を読み取り、花びらのように描画します。
- ブドウの蔓が文字の上を通ったり下を通ったりし、葉や花が文字の**カウンター部分(くぼみ)**に配置されます。
- テキスト処理: 文字は目に見えずタイプライターとして処理されるため、原文(例:"Every")がそのままコピーされます。
見出しと特定の場所への配置
- 見出しの花:
オプション有効時に、各セクションの見出し傍らにアクセント色(銅色)の花が配置されます。sections - 行末の花:
コマンドで特定の行の傍らに花を配置できます。\florilegiumbloom[lily]
季節 (aging
)
aging
オプション有効時に、庭園はページが進むごとに年齢を重ねます。aging- 春 (初頁): 蕾が多く、葉は小さく薄い色。
- 秋 (終頁): 種実頭部、落ちる花びら、銅色の葉が出現。
- 設定: 2 回のコンパイル(パス)が必要です。
で手動で年代を設定可能です。\florilegiumage{0.8}
来訪者 (visitors
)
visitorsほぼすべてのページに以下の生物がランダムに出現します。
- 蝶々・蜜蜂・鳥
- カタツムリ: メインの茎の一つを這う姿
- 除外設定:
オプションでこれらの生物を表示させません。novisitors
インクの色使い (Any ink)
- パレットは 1 つのドキュメントカラー(セピア、緑、赤、紫など)から派生します。
- グラデーション: 最も濃いストロークから薄いワッシュへ。OKLCH 色空間で彩度を計算し、明部でも青みを維持します。
PostScript での実装 (florilegium.ps
)
florilegium.ps純粋な PostScript で成長型余白を記述する自己完結型のファイルです。
- 機能: Ghostscript やプリンタがページを解釈する際、すべての花びらを計算します。
- 移植元:
,ink.lua
,flora.lua
の手続き単位からの移植。TeX は不要です。grow.lua
実行コマンド例
gs -dALLOWPSTRANSPARENCY -sDEVICE=pdfwrite -dSeed=7 -o garden.pdf postscript/florilegium.ps make postscript # 同上 -> build/postscript-7.pdf
設定オプション
- 庭園選択:
を指定。指定なしの場合はクロック値が使用されます(各印刷で異なる庭園)。-dSeed=N - 季節設定:
で調整可能。-dAge=0 to 1 - 来訪者除外:
フラグを使用。-dNoVisitors - 実行時間: 2 ページの描画に約 2.5 秒 かかります。
制限事項 (Lua から PostScript へのマッピング不可)
- レイヤー: 裏から表へ描画されるため、フィルとストロークをリストでキャプチャし、最後に再生成する必要があります。
- トランスパレンシー: Ghostscript の
フラグが必要。なければ不透明に描画されます(より平面的になりますが、同じ庭園)。-dALLOWPSTRANSPARENCY - ランダム性: Lua の 64 ビット浮動小数点と PostScript の単精度実数による違いがあり、同一シードでも異なる結果になる可能性があります。
- テキスト: フォントセットアップは行えますが、イニシャル、アニメーション、手書きの構成はありません。
プリンタでの動作
コマンドで送信する場合、シード指定なしでもコンピューター印刷システムが再実行するため、各印刷で異なる庭園が生成されます。lp- プリンタはトランスパレンシーがないため、不透明バージョンが表示されます。
ビルドと使用方法 (Build & Usage)
構築コマンド (make
)
makemake # florilegium.tex, florilegium-grow.tex, composition の 3 つの PDF を生成 make seed-7 # 種 7 から 1 ページ -> build/seed-7.pdf make gallery # 園芸コレクション画像生成 (seeds.png, inks.png など) make grow-6 # 種 6 の成長アニメーション -> build/grow-6.gif + .mp4 make grow-6 EXPLAIN=1 # 自由な円盤も表示したバージョン
Docker 環境(TeX 未インストール時)
docker build -t florilegium-tex tools make RUN=tools/in-docker
Overleaf で使用する場合
以下のスタイルパッケージを読み込み、コンパイラを LuaLaTeX に設定します。
\usepackage[grown]{florilegium} % または \usepackage{florilegium} (手書き風)
カスタマイズ例
% 色パレットの定義 \definecolor{ink}{HTML}{5B2A1F} % セピア調の基本色 \definecolor{accent}{HTML}{B4662F} % ハイエラインの銅色 % イニシャル設定:段落 "This..." の T に飾り \florilegiuminitial[4]{T}his paragraph starts with a decorated T. % 特定の行に花を配置 \florilegiumbloom ... % 季節経過の設定 (成長型のみ) \florilegiumage{0.8} % ここから秋以降へ % テキスト終了後の処理 (成長型のみ) \florilegiumtextend
シードの固定
ランダムな庭園ではなく固定したシードを使用したい場合:
lualatex "\def\florilegiumseed{7}\input{florilegium-grow.tex}"
TikZ 内での描画
現在のスコープ(移動、回転、スケール)下で独自にプリミティブを描画できます。
\begin{tikzpicture} % 位置 (2,2) に移動し、20 度回転したスコープ内 \begin{scope}[shift={(2,2)}, rotate=20] \florilegiumdraw{flower}{1.3} \end{scope} % 位置 (5,0) で葉を描画 (深さパラメータ付き) \begin{scope}[shift={(5,0)}] \florilegiumdraw{leaf}{3.0, {depth=0.6}} \end{scope} % ゴーストフラワー(リリス種) \begin{scope}[shift={(8,1)}] \florilegiumdraw{ghost}{{"lily", {s=1.4}}} \end{scope} % 蝶々 \begin{scope}[shift={(11,1)}] \florilegiumdraw{butterfly}{1.5} \end{scope} \end{tikzpicture}
動作原理 (How it works)
コアモジュールとロジック
-
(描画):ink.lua- 幾何学は Lua で計算され、PDF パスオペレーターとして直接書き込まれます(TeX は演算を省きます)。
- プリミティブはアフィニア変換下のローカルフレーム内で描画されます。
- 色は OKLCH 空間で補間し、明部でも青みを維持します。
- ストロークはサンプリングではなく、2 つのオフセットベジェ曲線で表現されます。
-
(プリミティブ):flora.lua- 水彩画家の順序で描画:ワッシュ → スポット → 縁の色素 → スチーク → 脈紋。輪郭はほぼなし。
- 対象:花びら、スターリリス(開花前)、蕾、裂葉、総状花序、蝶々、鳥、銅色の輝きなど。
-
(手書き構成):authored.lua- 左下隅から根として成長し、制御点を通過して伸びます。
- フッターとして沿う茎や、葉の配置割合が設定可能です。
-
(生成構成):grow.lua- SIGGRAPH 1998 の「Computer-Generated Floral Ornament」に基づきます。
- 反復的プロセス:最大の自由な円盤を見つけ合い、最も近い茎ポイントから枝を成長させます。
- 順序: 大きな穴(花・リリス)→ 中程(葉・スプレイ)→ 小穴(蕾・小花)。
-
(ページの読み取り):florilegium.lua- テキストに目に見えないマーカーノードを残し、ページ出力時にボックス内を巡回します。
- マーカーの高さを発見し、庭園を配置します。
- 季節経過により、モチーフの重みが再計算されます(春→秋)。
-
(イニシャル):initial.lua- OpenType フォントの輪郭を読み取り、ベジェセグメント化し、最大のギャップを検出します。
- ブドウの蔓は Catmull-Rom 曲線として描画され、文字の上を交互に通ります。
再現性について
- 手続き的 ≠ ランダム: シードはページ番号から導出されるため、ページ n は常に庭園 n を受け取ります。
- これにより、ドキュメントを「タイプライター」のように安定して再現できます。
ライセンス
MIT