조판 문서의 여백을 장식으로 채우는 일은 보통 디자이너가 그린 이미지나 벡터 자산을 불러오는 방식으로 이뤄진다. 그런데 Florilegium이라는 오픈소스 프로젝트는 전혀 다른 길을 택했다. 이 프로젝트는 델프트 블루(Delft blue) 색조의 꽃 장식을 페이지 여백에 그려 넣는데, 외부 이미지도, 가져온 경로 데이터도, 별도 자산도 전혀 사용하지 않는다. 꽃잎 하나, 잎사귀 하나, 줄기 하나가 모두 Lua로 계산된 매개변수 곡선이며, 페이지가 조판되는 바로 그 순간에 수채화처럼 '칠해져' PDF 안에 직접 기록된다. 출발점은 소박했다. 레딧에 "이런 꽃을 LaTeX로 어떻게 그리느냐"는 질문이 올라왔고, 제작자는 원본 재현을 목표로 하지 않은 채 자신만의 한 가지 방법을 구현해 비슷한 분위기를 만들어냈다고 밝힌다.
손으로 빚은 원형, 난수로 변주하는 정원
핵심 아이디어는 '손으로 저작한 기본 도형(primitive)에 무작위 매개변수를 입히는' 방식이다. 넓은 꽃잎과 꽃, 비스듬히 본 별나리, 봉오리와 종모양 꽃, 잎사귀, 전갈 꼬리처럼 말린 물망초 집산화, 덩굴손과 씨앗 머리 같은 요소가 미리 정의돼 있고, 여기에 난수 매개변수가 더해져 매번 조금씩 다른 모습으로 그려진다. 그 결과 모든 페이지는 저마다 다른 '정원'을 갖게 된다. 같은 코드라도 시드(seed) 값만 바꾸면 전혀 다른 구성이 나오는데, 중요한 점은 이 무작위성이 재현 가능하다는 것이다. 시드는 페이지 번호에서 유도되므로 n페이지는 언제나 n번 정원을 얻는다. 제작자가 "절차적인 것은 무작위가 아니다"라고 강조하는 이유가 여기 있다. 조판 결과가 매번 흔들리지 않고 안정적으로 재현돼야 문서로서 쓸모가 있기 때문이다.
여백 채우기 로직에는 1998년 SIGGRAPH에 발표된 Wong, Zongker, Salesin의 'Computer-Generated Floral Ornament' 연구의 아이디어가 녹아 있다. 줄기가 먼저 기둥을 따라 올라가고, 자리가 있는 마디마다 잎이 걸린다. 그다음 탐욕적(greedy) 반복 루프가 작동하는데, 줄기가 닿을 수 있는 범위에서 가장 큰 빈 원을 찾아 거기에 맞는 모티프를 고르고 가장 가까운 줄기 지점에서 가지를 뻗는다. 큰 구멍부터 먼저 채워지므로 꽃과 나리가 일찍 자리 잡고, 잔가지와 잎이 중간을 메우며, 마지막에는 작은 봉오리와 꽃차례가 줄기 틈에 끼워진다. 본문 텍스트가 끝나는 지점은 같은 조판 과정에서 \pagetotal로 측정되기 때문에, 마지막 페이지에서 글이 일찍 끝나면 그 아래 빈 공간으로 가지가 아치형으로 뻗어 들어간다. 단 한 번의 컴파일로 레이아웃이 완성되는 셈이다.
색과 문맥에 반응하는 장식
색 처리 방식도 눈여겨볼 만하다. 전체 팔레트는 ink라는 단 하나의 문서 색에서 파생된다. 가장 어두운 획에서 가장 옅은 워시(wash)까지 이어지는 색 띠(ramp)를 그 색상 기준으로 OKLCH 색 공간에서 계산하는데, 이 덕분에 밝은 쪽 끝이 회색으로 바래지 않고 파란 기운을 유지한다. 칠하는 순서도 실제 수채화가의 작업을 흉내 낸다. 평평한 워시를 먼저 깔고, 그 위에 어두운 얼룩을 곱하기로 올리며, 가장자리에 안료가 고이게 하고, 흰색 줄무늬를 들어내듯 남긴 뒤 가는 잎맥 몇 개를 그린다. 윤곽선은 거의 쓰지 않는다. 장식은 문서 문맥에도 반응한다. 계절(age) 값을 0에서 1 사이로 주면 봄에는 봉오리, 가을에는 씨앗 머리가 많아지는 식으로 모티프 가중치가 바뀐다. 또 나비와 벌, 줄기를 기어오르는 달팽이, 다섯 페이지에 한 번꼴로 가지에 앉는 새 같은 '방문객'이 등장하는데, 이들은 별도의 난수 스트림에서 나오므로 방문객이 없는 페이지라도 나머지 구성은 동일하게 유지된다.
흥미로운 점은 이 모든 로직이 TeX 환경에 묶여 있지 않다는 것이다. 제작자는 그리기 코어와 성장 루프 전체를 순수 PostScript로 포팅해, 고스트스크립트나 프린터가 페이지를 해석하면서 직접 꽃잎을 계산하는 자기완결적 단일 파일(florilegium.ps)도 공개했다. 시드를 주지 않으면 시계에서 값을 가져오므로, 같은 파일을 프린터에 두 번 보내면 인쇄할 때마다 다른 정원이 자라난다. Lua의 상당 부분은 PostScript에 그대로 대응됐다. PostScript 자체의 변환 행렬이 각 도형을 배치하고, 경로와 베지에 곡선은 원래 지원되며, 런타임에 만들어지는 프로시저가 Lua의 클로저를 대신한다.
실무자에게 주는 의미와 한계
한국의 IT 실무자 입장에서 이 프로젝트는 당장 업무 문서에 꽃을 피우라는 제안이라기보다 절차적 생성과 결정론적 재현을 결합하는 설계 사례로 읽힌다. 외부 자산 의존을 없애고 모든 시각 요소를 코드로 계산하면 버전 관리와 재현성이 깔끔해진다는 점, 페이지 조판 정보(마커 노드의 높이, 남은 공간)를 읽어 레이아웃이 문맥에 반응하게 만든 점, 그리고 OKLCH 기반 색 보간처럼 지각적으로 자연스러운 색 처리를 명시적으로 설계한 점은 데이터 시각화나 생성형 그래픽을 다루는 개발자에게 참고할 만한 구체적 기법들이다. 실행 성능도 LuaLaTeX 기준 페이지당 약 1초, PostScript 두 페이지 약 2.5초로 가볍다.
다만 한계도 분명하다. 이 결과물은 특정 미감을 겨냥한 장식이라 범용 문서 템플릿으로 쓰기엔 용도가 좁고, LuaLaTeX나 고스트스크립트, 혹은 Overleaf 같은 환경 설정이 전제된다. 제작자 스스로도 레딧 원본이 어떻게 만들어졌는지는 모르며 이것은 '하나의 가능한 방법'일 뿐이라고 선을 긋는다. 투명도를 지원하지 않는 프린터에는 불투명 버전이 따로 전달되어야 하고, Lua 로직 가운데 네 가지는 PostScript로 그대로 옮겨지지 않았다는 점도 이식의 완전함에는 미치지 못한다. 그럼에도 모든 꽃이 뿌리까지 거슬러 추적 가능하도록 구성을 설계하고, 성장 과정을 프레임 단위로 기록해 애니메이션으로 재생할 수 있게 한 완성도는, 절차적 그래픽을 진지하게 공부하려는 사람에게 좋은 읽을거리가 되어 준다.