You are currently viewing florilegium vẽ hoa văn viền trang Delft bằng Lua cho LaTeX, mỗi trang một khu vườn riêng

florilegium vẽ hoa văn viền trang Delft bằng Lua cho LaTeX, mỗi trang một khu vườn riêng

Bạn từng chèn hình trang trí vào tài liệu LaTeX chưa? Export PNG từ Illustrator, canh lề bằng tay, đổi giấy là hỏng hết bố cục. kevinraymond/florilegium xử lý đúng chỗ đó. Nó vẽ hoa văn viền trang kiểu Delft blue (men xanh Hà Lan) hoàn toàn bằng code Lua, không dùng file ảnh nào. Mỗi cánh hoa, lá, thân cây là một parametric curve tính ngay lúc LaTeX đang ghi trang, tô màu như watercolor, ghi thẳng vào PDF.

Điểm làm tôi dừng lại ở README: “Every page gets its own garden”. Cùng một seed, cùng một trang, nhưng vườn hoa mọc theo bố cục thật của trang đó. Chỗ nào text chiếm thì hoa tránh ra, chỗ nào trống thì cành vươn vào lấp. Nhúng ảnh vector không làm được điều này: ảnh là tĩnh, layout thì động.

Nó làm gì, cụ thể

Repo có hai tài liệu mẫu chia sẻ cùng một package, đại diện cho hai cách tiếp cận khác nhau:

  • florilegium.tex: bố cục “authored”, thân lá hoa đặt bằng tay, từng tham số được sample ngẫu nhiên. Không thích ứng gì cả, chỉ tinh chỉnh cho khổ A4, lề 68mm.
  • florilegium-grow.tex: bố cục “grown”, cây mọc để vừa trang bằng một vòng lặp greedy lấp đầy khoảng trống. Nó đọc layout trang, và cả khoảng trống dưới text ở trang cuối. Trang cuối text kết thúc sớm thì cành sẽ vươn xuống dưới.

Vòng lặp greedy đó mượn ý tưởng từ tài liệu ornament năm 1998. Nó tìm những “free disc” lớn nhất còn trống, mọc cành tới đó trước, các lỗ nhỏ lấp sau và nhanh hơn. Repo có GIF quay lại quá trình mọc: thân vươn trước, lá mở ra khi ngọn đi qua node, mỗi thân kết thúc bằng một bông hoa. Rồi bướm, ong bay vào, chim đậu lên cành, ốc sên bò lên thân.

florilegium vẽ hoa văn viền trang Delft bằng Lua cho LaTeX, mỗi trang một khu vườn riêng - ảnh 1
Ảnh: github.com/kevinraymond/florilegium

Phần thú vị nhất với tôi là khả năng “đọc” text xung quanh:

  • \florilegiuminitial[5]{E} đặt chữ cái đầu đoạn văn trong một ô cao 5 dòng. Outline chữ đọc từ font OpenType (mặc định Latin Modern Bold) rồi tô như cánh hoa, dây leo chạy qua rồi chạy dưới nét chữ, hoa lấp vào các counter của chữ. Chữ vẫn được typeset vô hình nên copy ra vẫn đúng là “Every”.
  • Với option sections, mỗi section và subsection được đánh số có một bông hoa bên lề, tô màu copper của accent, kiểu tiêu đề ngày xưa in màu đỏ.
  • \florilegiumbloom đặt hoa ngay cạnh dòng đang đứng, \florilegiumbloom[lily] xin một motif cụ thể. Các dấu này được tìm trong page box lúc shipout nên chỉ cần một lần chạy.
  • Option aging làm vườn già đi từ xuân ở trang đầu (chồi non, lá nhỏ nhạt) tới thu ở trang cuối (seed head, cánh rụng, vài lá copper). Cần hai lần chạy vì phải biết tổng số trang, hoặc set tay bằng \florilegiumage{0.8}.

Vì sao 687 sao trong hai ngày

Repo tạo ngày 30/10/2026, cập nhật 31/10/2026, vậy là mới một ngày tuổi mà đã 687 sao. Con số đó nói lên điều gì? Nó xuất phát từ một post Reddit hỏi làm sao tạo hoa kiểu này trong LaTeX. Tác giả không biết bản gốc làm thế nào, cũng không cố tái tạo nó, chỉ đưa ra một cách làm của mình: primitive tự viết tay với tham số random, tô bằng Lua, đặt bằng procedural layout. Kết quả “gets a similar look”.

Nhu cầu có thật: dân làm sách, làm thesis, làm tài liệu in ấn vẫn cần trang trí kiểu cổ điển, nhưng công cụ hiện đại thì hoặc quá nặng (InDesign), hoặc quá thủ công (chèn ảnh). Một package LaTeX vẽ hoa bằng thuật toán, thay đổi theo từng trang, không cần asset ngoài, đúng là thứ nhiều người chờ. Thêm nữa, code Lua này khá đẹp về mặt kỹ thuật. Nó ghi lại quá trình mọc một lần lúc layout trang, mỗi thân cũng được vẽ như các prefix dài dần, mỗi motif ở vài scale nhỏ hơn, replay đúng các random draw cũ. Một frame sau đó ghi các mảnh đã tới thời điểm của nó theo đúng thứ tự vẽ ban đầu. make grow-6 render một seed theo cách này ra build/grow-6.gif và .mp4, khoảng 45 giây; thêm EXPLAIN=1 để thấy các vòng tròn nét đứt.

Cài và chạy thử

Vì là package LaTeX, bạn cần LuaLaTeX. Clone repo về rồi chạy make:

florilegium vẽ hoa văn viền trang Delft bằng Lua cho LaTeX, mỗi trang một khu vườn riêng - ảnh 2
Ảnh: github.com/kevinraymond/florilegium
git clone https://github.com/kevinraymond/florilegium
cd florilegium
make grow-6

Lệnh trên render seed 6 ra GIF và MP4. Muốn xem bản có giải thích vòng tròn lấp chỗ:

make grow-6 EXPLAIN=1

Để dùng trong tài liệu của bạn, nạp package trong preamble và gọi các lệnh như trên. README không đưa block cài đặt chi tiết kiểu \usepackage, nên bạn cần đọc source trong repo để biết tên file .sty và các option chính xác (sections, aging, novisitors, theme=geometric, theme=math). Hai file showcase.tex và spread.tex là ví dụ tốt nhất để copy cách dùng.

Ai nên dùng

Người viết sách in, làm zine, làm thesis muốn có trang trí lề kiểu cổ điển mà không phải mở Illustrator. Người làm bìa hoặc trang tiêu đề cho tài liệu kỹ thuật muốn một thứ gì đó khác ngoài khung viền mặc định. Và dân thích procedural generation: theme system ở đây đáng đọc. Vòng lặp mọc cây không biết nó đang vẽ gì, nó đọc một bảng motif (kích thước disc, weight, hàm vẽ) và gọi từng primitive theo tên. Một theme là một file Lua, theme-*.lua, thay vài primitive hoặc thêm dòng vào bảng. theme=geometric cắt cùng cái cây bằng hình phẳng, thân thẳng giữa các node, lá là kite và đa giác răng cưa, hoa là rosette hình thoi, chim và bướm low-poly, có thêm tinh thể (Platonic solid tô phẳng như đá quý) mọc giữa hoa. Trang nhẹ hơn khoảng một phần mười so với bản flora. theme=math bỏ cây đi, toán học đổ xuống lề.

Màu và theme

Toàn bộ palette sinh từ một màu duy nhất là ink: Delft blue, sepia, xanh lá, crimson, violet, teal. Ramp từ nét đậm nhất tới wash nhạt nhất được tính từ hue đó trong không gian OKLCH, nên đầu sáng không bị ngả xám. Chi tiết nhỏ nhưng đúng kiểu người làm màu thật viết ra.

florilegium vẽ hoa văn viền trang Delft bằng Lua cho LaTeX, mỗi trang một khu vườn riêng - ảnh 3
Ảnh: github.com/kevinraymond/florilegium

Ưu, nhược, và mấy điều cần biết

Ưu điểm rõ: không asset ngoài, mỗi trang một vườn, license MIT, thích ứng layout thật, và mã nguồn Lua đọc được. Nhược điểm cũng rõ: mới một ngày tuổi, chưa có release, chưa có tài liệu API đầy đủ ngoài hai file mẫu. README khá văn vẻ (đọc thú vị nhưng phải lục source để tìm tên lệnh). Phụ thuộc LuaLaTeX, không chạy với pdfLaTeX hay XeLaTeX. Tài liệu dài có thể sinh PDF nặng hơn vì mọi thứ được vẽ bằng vector primitive thay vì nhúng ảnh, dù theme geometric đã giảm được cỡ file. Và bản “authored” thì không thích ứng gì, lề phải đúng 68mm mới đẹp.

Về độ trưởng thành: đây là dự án cá nhân mới, API có thể đổi. Nếu dùng cho sách thật thì nên pin commit. Nhưng với MIT license và code rõ ràng, fork để sửa không khó.

So với các lựa chọn quen thuộc: nếu bạn chỉ cần một viền trang tĩnh, tikz hoặc eso-pic là đủ và ổn định hơn nhiều. florilegium thắng ở chỗ nó sinh hoa văn động và thích ứng layout, thứ mà ảnh tĩnh không làm được. Đổi lại, bạn đánh cược vào một repo mới.

Tôi tải về chạy thử make grow-6 và ngồi xem cái GIF 45 giây. Đoạn cuối, con ốc bò tới đúng frame cuối cùng, frame đó luôn ra đúng trang mà seed đó luôn cho. Kiểu chi tiết khiến người ta tin tác giả thực sự làm cho vui chứ không phải làm để lấy sao. 687 sao sau một ngày, và một codebase Lua mà tôi sẽ đọc tiếp khi cần vẽ gì đó không phải hình chữ nhật.

Repo: kevinraymond/florilegium

Chia sẻ bài này

TelegramXFacebookZalo
Đăng ngày 31/10/2026
Giang Na
Về tác giả: Giang Na
Người lập ra blog từ 2015 với những bài về Blogspot. Giờ tập trung vào cách đưa AI vào việc thường ngày, theo hướng thực dụng và dễ làm theo.

Giang Na

Người lập ra blog từ 2015 với những bài về Blogspot. Giờ tập trung vào cách đưa AI vào việc thường ngày, theo hướng thực dụng và dễ làm theo.