Florilegium: Khu vườn hoa hoa văn được sinh tự động ngay trong LaTeX

Công nghệ30 tháng 10, 2026·7 phút đọc

Một dự án mã nguồn mở tạo ra các đường viền trang trí hoa lá màu xanh Delft cho tài liệu LaTeX, trong đó mọi cánh hoa, chiếc lá và thân cây đều là đường cong tham số được tính bằng Lua và vẽ trực tiếp vào PDF — không dùng hình ảnh hay tài nguyên bên ngoài. Mỗi trang nhận một khu vườn riêng, và khu vườn có thể tự mọc lấp đầy khoảng trống còn lại của trang.

Florilegium: Khu vườn hoa hoa văn được sinh tự động ngay trong LaTeX

Florilegium: Khu vườn hoa hoa văn được sinh tự động ngay trong LaTeX

Có những dự án mã nguồn mở ra đời chỉ để trả lời một câu hỏi tưởng chừng rất nhỏ trên mạng. Florilegium là một ví dụ như vậy: khi một người dùng Reddit hỏi làm thế nào để tạo ra những bông hoa trang trí như thế trong LaTeX, tác giả Kevin Raymond đã không sao chép lại mà tự xây dựng một hướng tiếp cận hoàn toàn khác — và kết quả là một gói LaTeX đáng chú ý về cả mặt kỹ thuật lẫn thẩm mỹ.

Mẫu hoa văn được sinh tự động với các tham số ngẫu nhiênMẫu hoa văn được sinh tự động với các tham số ngẫu nhiên

Một khu vườn không có hình ảnh

Điểm độc đáo của Florilegium nằm ở chỗ nó không sử dụng bất kỳ hình ảnh, đường dẫn nhập khẩu hay tài nguyên ngoài nào. Mỗi cánh hoa, chiếc lá và thân cây đều là một đường cong tham số được tính toán bằng Lua ngay trong lúc trang đang được soạn, sau đó được tô màu như tranh thủy mặc và ghi thẳng vào tệp PDF.

Nói cách khác, tài liệu không "chèn" hình — nó vẽ ra hình bằng chính các toán tử đồ họa của PDF. Điều này có nghĩa là mỗi trang đều nhận được một khu vườn riêng, không trang nào giống trang nào.

Dự án cung cấp hai cách bố cục chính:

  • Authored: thân, lá và hoa được đặt thủ công, với từng tham số được lấy mẫu ngẫu nhiên. Bố cục này được tinh chỉnh cho khổ A4 với lề 68 mm.
  • Grown: một "cái cây" được nuôi lớn để vừa vặn với trang nhờ vòng lặp tham lam lấp đầy khoảng trống, thích ứng với bố cục trang và phần không gian trống bên dưới văn bản ở trang cuối.

Khi lề trang biết "đọc" văn bản

Điểm thú vị nhất của phiên bản grown là nó có thể phản ứng với chính nội dung tài liệu. Tác giả gọi đây là khả năng "lề trang đọc văn bản":

  • Chữ cái đầu dòng trang trí: lệnh \florilegiuminitial[5]{E} biến chữ cái đầu tiên của đoạn văn thành một ô cao năm dòng. Đường viền của chữ được đọc từ font OpenType (mặc định là Latin Modern Bold) và tô như một cánh hoa, với dây leo chạy đan qua các nét chữ, lá chen vào chỗ trống và hoa nở trong các lỗ hổng của chữ cái.
  • Hoa bên cạnh tiêu đề: với tùy chọn sections, mỗi mục và tiểu mục được đánh số sẽ có một bông hoa bên lề, tô màu đồng — gợi nhớ cách các tiêu đề từng được in đỏ trong sách cổ.
  • Hoa theo yêu cầu: lệnh \florilegiumbloom đặt một bông hoa ngay cạnh dòng chứa lệnh đó.
  • Bốn mùa: với tùy chọn aging, khu vườn "già đi" từ mùa xuân ở trang đầu (chủ yếu là nụ, lá non nhỏ nhắn) đến mùa thu ở trang cuối (đầu hạt, cánh hoa rơi, lác đác vài chiếc lá màu đồng).

Trang cuối của tài liệu grown: văn bản kết thúc sớm nên các cành vươn ra lấp khoảng trống bên dướiTrang cuối của tài liệu grown: văn bản kết thúc sớm nên các cành vươn ra lấp khoảng trống bên dưới

Cơ chế hoạt động đằng sau

Về mặt kỹ thuật, Florilegium là một ví dụ đẹp về cách LuaTeX có thể mở rộng khả năng của TeX. Toàn bộ hình học được tính trong Lua và ghi thành các toán tử đường dẫn PDF vào một nút duy nhất cho mỗi trang — TeX không phải làm bất kỳ phép tính nào.

Các kỹ thuật đáng chú ý bao gồm:

  • Bảng màu từ một màu gốc: toàn bộ dải màu được tính từ một màu duy nhất là ink (xanh Delft, nâu sepia, xanh lá, đỏ thẫm, tím, xanh mòng két). Phép nội suy diễn ra trong không gian màu OKLCH, nhờ đó đầu sáng của dải màu vẫn giữ được sắc xanh thay vì bị xám đi.
  • Vẽ như họa sĩ màu nước: mỗi hình được tô theo trình tự một lớp nền phẳng, các vệt đậm nhân lên trên, sắc tố đọng ở viền, những vệt trắng được "nhấc" ra, rồi thêm vài đường gân mảnh — gần như không có đường viền.
  • Bố cục mọc tự nhiên: lấy cảm hứng từ bài báo Computer-Generated Floral Ornament của Wong, Zongker và Salesin (SIGGRAPH 1998). Thuật toán lặp đi lặp lại việc tìm khoảng trống lớn nhất trong tầm với của một thân cây, chọn một họa tiết vừa với khoảng đó và mọc một cành vươn tới. Lỗ lớn được lấp trước, nên hoa lớn và hoa loa kèn xuất hiện sớm, các cụm lá lấp phần giữa, và vòng lặp kết thúc bằng những chiếc lá nhỏ, nụ hoa và hoa nhỏ nép vào thân.

Cận cảnh 300 dpi: mảng màu lốm đốm với vệt trắng, lá có gân trắng, cụm hoa lưu ly và một bông hoa mờ phía sauCận cảnh 300 dpi: mảng màu lốm đốm với vệt trắng, lá có gân trắng, cụm hoa lưu ly và một bông hoa mờ phía sau

Từ Lua sang PostScript thuần

Một điểm cộng đáng kể: dự án còn có phiên bản PostScript thuần trong một tệp tự chứa duy nhất (postscript/florilegium.ps). Ghostscript hoặc một chiếc máy in sẽ tự tính từng cánh hoa ngay khi diễn giải trang, và hai trang văn bản trong tệp giải thích cách nó hoạt động.

Điều thú vị là nếu in tệp này hai lần mà không chỉ định seed, hệ thống in của máy tính sẽ chạy lại chương trình cho mỗi lệnh in, lấy seed từ đồng hồ hệ thống — nên mỗi bản in lại là một khu vườn khác. Đây là một ý tưởng khá thơ mộng cho một tệp PostScript.

Ba khác biệt kỹ thuật đáng chú ý so với bản LaTeX:

  • Lớp: khu vườn mọc theo một thứ tự nhưng được tô từ sau ra trước, nên mọi nét tô và viền được ghi lại bằng pathforall vào danh sách theo từng lớp rồi phát lại ở cuối.
  • Độ trong suốt: PostScript vốn không hỗ trợ, Ghostscript bổ sung qua cờ -dALLOWPSTRANSPARENCY. Nếu không có cờ này, mỗi mảng tô trong suốt sẽ được trộn với màu nền dự kiến và tô đặc — kết quả phẳng hơn nhưng vẫn là cùng một khu vườn.
  • Số ngẫu nhiên: bộ sinh Park-Miller trên số nguyên 32-bit gặp giới hạn số thực độ chính xác đơn của PostScript, nên seed 7 ở đây cho ra khu vườn khác với seed 7 trong LaTeX.

Dùng thử trong tài liệu của bạn

Việc tích hợp khá đơn giản. Sau khi nạp gói với tùy chọn grown, bạn có thể dùng các lệnh như \florilegiuminitial cho chữ cái đầu trang trí, \florilegiumbloom để đặt hoa theo dòng, hay \florilegiumage{0.8} để chuyển sang mùa thu.

Đáng chú ý là tính tái lập được đặt lên hàng đầu: seed được suy ra từ số trang, nên trang thứ n luôn nhận khu vườn thứ n. Đây chính là yếu tố khiến tài liệu đủ ổn định để có thể sắp chữ nhiều lần mà kết quả không đổi.

Dự án phát hành theo giấy phép MIT, có hỗ trợ Docker cho ai chưa cài TeX, và có thể dán thẳng các tệp vào Overleaf với trình biên dịch LuaLaTeX. Tác giả ước tính mỗi trang mất khoảng một giây để dựng, và với showcase.tex cần hai lượt biên dịch vì phần mùa cần biết tổng số trang.

Với cộng đồng người dùng LaTeX tại Việt Nam — đặc biệt là những ai làm luận văn, sách hoặc tài liệu cần trình bày đẹp — Florilegium là một công cụ đáng để thử, vừa như một giải pháp trang trí tinh tế vừa như một bài học thực tế về lập trình đồ họa thủ tục.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗