Quick Answer: LaTeX floral page margins don't need image files. The florilegium package builds each petal, leaf and stem as a parametric curve in Lua during typesetting, paints it like watercolor, and writes it straight into the PDF. The same seed always gives the same garden, and a new seed gives a new one.
Most people searching for LaTeX floral page margins want one of two things: a border that looks hand-painted, or a way to stop pasting clip art into their documents. Kevin Raymond's florilegium repository does the second by generating the whole margin in code. The project started from a Reddit thread asking how someone made flowers like these in LaTeX. The author says he doesn't know how that original was made, and he deliberately tried not to copy it. Here's how the package works, where it earns its place, and where it doesn't.
Why draw a margin instead of importing one?
The usual advice is to find a good PNG or SVG, drop it into the margin, and move on. That works until your layout changes. An imported image has one fixed size and one fixed composition, so every change to margin width, font or page count means re-fitting it by hand.
A drawn margin adapts. Florilegium's authored document is tuned for A4 with a 68 mm margin, but the grown document, florilegium-grow.tex, fills whatever space the layout leaves free. Why draw a margin at all? Because the drawing is a function of its inputs, and you can change the inputs.
The reproducibility point surprises people. A generative margin sounds unpredictable, yet every random draw comes from a seed. Set seed=7 and you get the same page on every build, which matters when a printer is waiting on a proof. Set seed=random when you want a new garden each time. The package is also self-contained: "no images, no imported paths, no external assets," so nothing breaks when a figure file goes missing.
How the margin is actually painted
Every element is computed while the page is laid out. Stems, leaves, petals and tendrils are parametric curves with randomized parameters, and each is painted with a watercolor-style wash: mottled tones, white streaks lifted out, and lobed leaves with white veins. The result is written directly into the PDF with no rasterization step.
Growth follows a greedy space-filling loop. The author describes it this way: the loop finds the largest free disc in the margin, grows a branch toward it, and repeats. Big holes get filled first and slowly, small ones last and quickly. The growth is recorded once during layout, with each stem drawn as prefixes of increasing length, so an animation can replay the same random draws. That's why make grow-6 can render a 45-second GIF or MP4 of one seed.
Initial letters work differently. \florilegiuminitial[5]{E} reads the letter's outline from an OpenType font, Latin Modern Bold by default, and paints it as a petal. A vine then passes over and under its strokes. The letter is also typeset invisibly, so the paragraph still copies as "Every." That detail matters if you care about accessible or searchable PDFs, and most decorative packages skip it.
Authored or grown: which document do you need?
Florilegium ships two main documents that share one package. The difference is who places the plant.
| Feature | florilegium.tex (authored) | florilegium-grow.tex (grown) |
|---|---|---|
| Composition | Stems, leaves and flowers placed by hand, every parameter sampled | A plant grown to fit the page by a greedy space-filling loop |
| Adapts to | Nothing; tuned for A4 with a 68 mm margin | The page layout and free space below the text on the last page |
| Best for | A fixed, predictable look you can proof once | Documents whose text length changes during drafting |
| Setup | Load the package with defaults | Load with grown, e.g. \usepackage[grown]{florilegium} |
Choose authored when the page is final and you want a composition you've already seen. Choose grown when the text will keep moving, such as a thesis or a long report, because the garden refills the space the text leaves behind.
Here's the setup for a grown margin in five steps:
- Compile with LuaLaTeX, since the drawing runs in Lua and won't work under pdfLaTeX.
- Load the package with
\usepackage[grown]{florilegium}. - Set a seed you like, such as
seed=6, so the page is reproducible. - Compile once and check the page. Seasonal aging needs two runs because it depends on the page count.
- Preview the output in your printer's proof workflow before you send the file out.
Dialing it down so the text still reads
Here's a question most margin tutorials never answer: who wants a full garden beside an equation? The author's answer is a dial. Two options turn the margin down, and they work with any theme.
densitycontrols how much grows. Atdensity=0.4, the loop stops at larger holes, leaves more paper around each motif, and hangs fewer leaves and fillers.intensitycontrols how dark the paint is. Atintensity=0.5, the whole margin is painted paler, changing only the color and not the detail.
The counter-intuitive part is that a low density doesn't just mean fewer decorations. At density=0.05, the author says the plant itself thins out: a single vine with its flower, a couple of leaves, and one or two sprays. You get a complete picture with much less ink.
\usepackage[grown,density=0.4,intensity=0.6]{florilegium}
At the defaults (1 and 1), the output is exactly the page it was before. That's a useful regression check when you're updating the package.
Themes: flora, geometric and math
The growth loop doesn't care what it draws. It reads a table of motifs, each with a disc size, a weight and a drawing function, and calls them by name. A theme is a Lua file that replaces some of those primitives. The package ships with two.
theme=geometric keeps the same plant and cuts it from flat shapes. Stems run straight between nodes, leaves become kites and toothed polygons with straight white veins, and flowers become rosettes of rhombi. Crystals, drawn as Platonic solids, grow among the flowers.
theme=math drops the plant altogether. It sets mathematics down the margin and across the bottom of the page: an Apollonian gasket or Koch snowflake in the corner, Platonic solids, Lissajous curves, Maurer roses, and equations such as e^{iπ} + 1 = 0 running along the bottom. The author notes that the math theme fills whatever space the page leaves, like the garden does, and that density controls how much there is.
\usepackage[grown,theme=geometric]{florilegium}
\florilegiumtheme{math}
Here's the trade-off. Flora suits a book of poetry or a personal document. Geometric suits a technical handout where you want the margin to read as clean shapes. Math suits a lecture note, but it's the busiest of the three, and you should check it beside dense equations before you commit.
Caveats before you ship it
A few honest limits matter for real documents.
The package needs LuaLaTeX, and the generation runs in Lua at build time. If your publisher insists on a specific engine, confirm it before you build the template. Seasonal aging via aging needs two runs, so a single compile won't show the final look. And the grown layout depends on the text, so a last-minute edit can shift where the garden lands; check the final pages after every major change.
The project also states that it was made with AI assistance (Claude), and the author links to his process notes. That's worth knowing if your institution has an AI-disclosure policy. Treat the package as one possible method, not the method behind the Reddit original, because the author says so himself.
Frequently Asked Questions
what are latex floral page margins?
LaTeX floral page margins are decorative flower and leaf borders drawn in the page margin by LaTeX code, not inserted as image files. The florilegium package draws them with Lua under LuaLaTeX, using parametric curves and a watercolor-style paint. Each seed produces a different but reproducible garden, and the margin can fill the space that the text leaves free.
how do you add floral margins to a latex document?
Compile with LuaLaTeX and load the package with \usepackage[grown]{florilegium}. Set a seed such as seed=6 so the output stays the same between builds. Use density to reduce how much grows and intensity to paint it paler. Compile once, then check the final pages in your proof.
why does my generated margin look different each build?
Most likely you're using seed=random, which draws a new seed each time the PDF builds. Set a fixed seed, such as seed=7, to get the same margin on every build. A layout change, such as a new font size or a longer paragraph, can also shift where the garden grows, even with a fixed seed.
does a generated floral margin work without internet access or image files?
Yes. The package has no external assets: every petal, leaf and stem is computed in Lua while the page is being written. Nothing is downloaded or imported, so the margin still compiles offline. The only font it reads is an OpenType font such as Latin Modern Bold, which ships with standard TeX distributions.
Bottom line: LaTeX floral page margins are practical when you want a fixed, reproducible look that still adapts to changing text. Try the playground, pick a seed you like, and print its proof this week. Then pass this to someone wrestling with an empty margin in their thesis.